2013-08-21 32 views
2

我開始在Django中創建一個網上商店。它會有不同種類的產品,如襯衫,海報,馬克杯,貼紙。每種產品都有不同的領域。例如:襯衫將有尺寸和顏色選項,貼紙將有尺寸選項,海報和杯子將沒有選擇。Django - 網上商店模型組織

這樣做的最好方法是什麼?遺產?關係?

我還在學習Django,並且想在更深入瞭解這類項目之前從更有經驗的人那裏瞭解這一點。

謝謝

回答

3

這是一個有趣的問題。我相信首先你必須知道你的用戶是否想自己添加項目類型,或者是否有預定義的類型數量,如果需要,只有開發人員可以添加一個新類型。

靜態項目類型

如果項目類型是靜態的,你可以使用模型繼承來創建你的架構。因此,在這種情況下,我建議爲每個項目類型定義一個或多個抽象基礎模型和具體模型。舉例來說,你會做這樣的事情:

 
class Item(models.Model): 
    slug = models.SlugField() 
    price = models.DecimalField() 
    remaining = models.IntegerField() 
    description = models.CharField() 

    class Meta: 
    abstract=True 

class ClothingItem(Item): 
    size = models.CharField() 
    brand = models.CharField() 

    class Meta: 
    abstract=True 

class Jacket(ClothingItem): 
    has_hood = models.BooleanField() 

class Hat(ClothingItem): 
    hat_type = models.CharField(choices=[]) 

所以,上面會產生實際只有兩個數據庫表:外套,戴上帽子,每一個將包含從它繼承自車型中的所有領域。這是大多數人在Django中使用的原因,因爲它非常乾淨,因此添加表單和生成查詢來獲取Items非常容易。

你的其他選擇是不使用抽象基類,所以你會得到一個名爲Item數據庫表將包含各領域,命名ClothingItem另一個表將包含一個ForeignKey到Item,另一個名爲Jacket將包含一個ForeignKey到ClothingItem。這將幫助您在ItemClothingItem上生成聚合,但是,只要您想獲得夾克的屬性,django就必須查詢三個表(帶連接)。我建議只有在你肯定需要的時候才使用它。

動態項目類型 在這種情況下,你必須使用一個不同的模式,因爲項目的性質必須由應用程序的用戶定義。你可以這樣做:

 
class Category(models.Model): 
    name = models.CharField() 

class Attribute(models.Model): 
    category = models.ForeignKey(Category) 
    name = models.CharField 

class Item(models.Model): 
    slug = models.SlugField() 
    price = models.DecimalField() 
    remaining = models.IntegerField() 
    category = models.ForeignKey(Category) 
    description = models.CharField() 
    attributes = models.ManyToManyField(Attribute, through='ItemAttribute') 

class ItemAttribute(models.Model): 
    item= models.ForeignKey(Item) 
    attribute = models.ForeignKey(Attribute) 
    value = models.CharField() 

這個設計有點複雜。我們這裏有一個類別模型,可以定義你的物品類型(帽子,夾克,馬克杯,襯衫,海報等) - 你也可以定義一個類別層次結構,我將作爲練習留給你。屬性模型定義了屬性的名稱 - 每個屬性都有一個名稱和一個屬於它的類別。因此,對於夾克類別,您將具有has_hood屬性,對於帽子類別爲hat_type屬性等。

現在,一個項目模型也屬於一個類別,並且具有與屬性模型的多對多關係ItemAttribute型號。最後一個意味着你將有一個 ItemAttribute表在你的數據庫具有以下字段:

 
item - attribute - value 

所以外套312將與屬性2(has_hood)與true值,而外套313將屬性2的值爲假等。

上述設計有一個小問題,即屬性中沒有「類型」。您應該通過將_type屬性添加到Attribute模型來擴展它。 此外,請檢查以下問題的答案: Django dynamic model fields它以更通用的方式定義動態模型字段。

使用此設計,用戶將能夠創建新屬性並將其分配給類別,因此,當他們添加新項目時,他們將能夠根據其類別填充其屬性。當然,爲了讓用戶能夠做到這一點,您還必須生成包含每個項目的動態屬性的動態表單。如果你想,我可以告訴你如何做到這一點 - 並不像有人認爲一樣困難(提示:使用type來生成動態Form類)。

+0

感謝您的回答Serafeim,從中學到很多東西 – fgalvao