0

概念:

飲み物は成分でできています。例えばウォッカ10ml。一部の領収書では、成分が非常に特殊なもの (Finlandia Vodka 10ml) もあれば、そうでないもの (ANY Vodka 10ml) もあります。

この問題を解決するためにコンポーネントをモデル化する方法を考えています。より多くの要件を満たすことができる特定の製品を在庫に持っています。

現在のモデルは次のとおりです。

class Receipt(models.Model):
  name = models.CharField(max_length=128)
  (...)
  components = models.ManyToManyField(Product, through='ReceiptComponent')

  def __unicode__(self):
    return self.name

class ReceiptComponent(models.Model):
  product = models.ForeignKey(Product)
  receipt = models.ForeignKey(Receipt)
  quantity = models.FloatField(max_length=9)
  unit = models.ForeignKey(Unit)
  class Admin:
    pass
  def __unicode__(self):
    return unicode(self.quantity!=0 and self.quantity or '') + ' ' + unicode(self.unit) + ' ' + self.product.genitive

class Product(models.Model):
  name = models.CharField(max_length = 128)
  (...)
  class Admin:
    pass
  def __unicode__(self):
    return self.name

class Stock(Store):
  products = models.ManyToManyField(Product)
  class Admin:
    pass
  def __unicode__(self):
    return self.name

実際の製品 (在庫) と抽象的な製品 (レシート コンポーネント) を結合するテーブルを作成することを考えています。しかし、おそらく簡単な解決策がありますか?

4

1 に答える 1

1

製品オブジェクトが階層にあるツリー構造を使用して、さらに複雑なアプローチを採用すると思います。子ノード「vodka」、「whisky」、「beer」を持つ「alcohol」というノードが存在する場合があります。「vodka」には子ノード「Finnish vodka」と「Russian vodka」があります。

在庫に「Finish vodka」がない場合は、最初にすべての子ノード (「Absolut vodka」など) をチェックし、次にその兄弟ノード (「russian vodka」) を調べてから、その親ノードを (逆の順序で) 調べます ("ウォッカ」、「アルコール」) 在庫があるものが見つかるまで。num_in_stock は、製品テーブルの整数フィールドになります。

django のツリーに最適な Google コードhttp://code.google.com/p/django-mptt/には、mptt (Modified Pre-ordered Tree Traversal) と呼ばれるよく知られた優れた実用的なアプリがあります。

于 2010-06-09T21:42:15.187 に答える