2010-06-09 36 views
0

概念:django造型

飲料是由部件組成。例如。 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 

我想想做一些表,加入真正的產品(股票)與抽象產品(receiptcomponent)。但也許有簡單的解決方案?

回答

1

我想我會採用更復雜的方法,使用產品對象在層次結構中的樹結構。可能有一個節點稱爲「酒精」,孩子節點爲「伏特加」,「威士忌」,「啤酒」。和「伏特加」有子節點「芬蘭伏特加」和「俄羅斯伏特加」

如果沒有「完成伏特加」的股票,首先檢查它的所有孩子(「絕對伏特加」,...),然後遍歷其兄弟姐妹(「俄羅斯伏特加酒」),然後是其父節點(以相反的順序)(「伏特加酒」,「酒精」),直到發現有庫存。 num_in_stock將是產品表中的整數字段。

在谷歌代碼http://code.google.com/p/django-mptt/上有一個衆所周知的偉大工作應用程序mptt(Modified Pre-ordered Tree Traversal),這對django中的樹木非常有用。

+0

這真的很酷的應用程序。在我的情況下完美。謝謝! – 2010-06-11 09:45:51