2013-04-14 67 views
0

我有一個網上商店。有單件物品可以購買,但也有一些包含一些單件物品。 現在我正試圖找到這些關係的最佳/有用的解決方案。這是迄今爲止我所擁有的。Django:三款相互關聯,最好的方式是什麼

型號:

class Wine(models.Model): 
    name = models.CharField(max_length=128) 

class WineBox(models.Model): 
    name = models.CharField(max_length=128) 
    wines = models.ManyToManyField(Wine) 

class Product(models.Model): 
    wine = models.OneToOneField(Wine, blank=True, null=True) 
    winebox = models.OneToOneField(WineBox, blank=True, null=True) 
    price = models.DecimalField(max_digits=4, decimal_places=2) 
    public = models.BooleanField(blank=True) 

回答

0

感謝所有的幫助,但最終我想出了一個非常簡單的解決方案,完美地滿足了我的需求。我不想使用泛型關係,因爲我可以控制所有模型,而且它們使一切變得複雜,或者說Cartucho解決方案,因爲我可能希望稍後再使用更多的產品。我使用產品作爲基類,現在的模型看起來像:

class Product(models.Model): 
    price = models.DecimalField(max_digits=4, decimal_places=2) 
    public = models.BooleanField(blank=True) 

class Wine(Product): 
    name = models.CharField(max_length=128) 

class WineBox(Product): 
    name = models.CharField(max_length=128) 
    wines = models.ManyToManyField(Wine) 
1

WineBoxProduct必要嗎?似乎有點多餘。爲什麼不是更容易,如:

class Wine(models.Model): 
    name = models.CharField(max_length=128) 

class Product(models.Model): 
    wine = models.ForeignKey(Wine) 
    winebox = models.ManyToManyField(Wine) 
    price = models.DecimalField(max_digits=4, decimal_places=2) 
    public = models.BooleanField(blank=True) 

這看起來還是多餘的,我更願意從Product刪除wine場和剛剛離開:

class Product(models.Model): 
    wines = models.ManyToManyField(Wine) 
    price = models.DecimalField(max_digits=4, decimal_places=2) 
    public = models.BooleanField(blank=True) 

希望它能幫助。

+0

好點!我的第一個想法是向WineBox添加更多信息,例如包裝鏡頭或不同的標題。 (對不起,我在我的問題中沒有這麼具體)。但是也許值得將它添加到產品類中,而不是增加一個模型。 – horndash

+1

@horndash我最好的建議是保持你的數據模型簡單,不要過度設計。乾杯! – Cartucho

+2

我會研究這個問題的一般關係:假設您想要有多種類型的產品,目前'Product'只能將'Wine's作爲「內容」。看看這個:https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#id1 –

相關問題