0

概念:

饮料是由成分制成的。例如 10 毫升伏特加。在某些收据中,成分非常特别(10 毫升芬兰伏特加),有些则不是(10 毫升任何伏特加)。

我想知道如何建模一个组件来解决这个问题——我有特定的产品,可以满足更多的要求。

现在的模型是:

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

我想我会采用一种更复杂的方法,使用产品对象位于层次结构中的树结构。可能有一个名为“alcohol”的节点,其子节点为“vodka”、“whisky”、“beer”。而“vodka”有子节点“Finnish vodka”和“Russian vodka”

如果库存中没有“Finish vodka”,首先检查其所有子节点(“Absolut vodka”,...),然后遍历其兄弟节点(“russian vodka”),然后遍历其父节点(以相反的顺序)(“伏特加”、“酒精”),直到找到有货的产品。num_in_stock 将是产品表中的整数字段。

在 google 代码http://code.google.com/p/django-mptt/上有一个名为 mptt(Modified Pre-ordered Tree Traversal)的著名且出色的工作应用程序,它非常适合 django 中的树。

于 2010-06-09T21:42:15.187 回答