2011-02-16 66 views
1
class Category(models.Model): 
    name = models.CharField(max_lenth=50) 

class SubCatergory(models.Model): 
    parent_category = models.ForeignKey(Category) 
    name = models.CharField(max_length=100) 

class Product(models.Model): 
    sub_category = models.ManytoManyField(SubCatergory) 
    name = models.CharField(max_length=100) 

以上是組織關係的最佳實踐,還是應該將貓/子貓的模型組合起來,使其更像是一個標記系統?例如,產品可以用「貓A」和「貓A」標記。該應用在啓動後不需要添加類別。Django與模型關係的最佳做法

回答

1

這真的取決於你的需求。如果你正在爲只需要兩級層次的系統編寫一個程序,那麼你所做的完全沒問題。如果你可以想象一個時間,你可能會有更復雜的層次結構,那麼把它們結合起來確實是有道理的

你提到了一個'產品',對我來說這意味着你想要一個嚴格的層次結構,所以你現在的模型看起來很好。

1

更靈活的將是代碼

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

class SubCatergory(Category): 
    parent_category = models.ForeignKey(Category) 

class Product(models.Model): 
    categories = models.ManytoManyField(Catergory) 
    name = models.CharField(max_length=100) 
4

更多的靈活性,我用這樣的模型結構是這樣的:

class Category(models.Model): 
    parent_category = models.ForeignKey('self', null=True, blank=True) 
    name = models.CharField(max_lenth=50) 

class Product(models.Model): 
    categories = models.ManytoManyField(Catergory) 
    name = models.CharField(max_length=100) 

所以,如果一個類沒有parent_category,那麼它是一個基本的,如果有,那麼它是一個子類別。

在該層次結構中,您可以定義無限深度的子類別層次結構,但在視圖層上,必須編寫模式行以獲取適當的類別列表作爲樹(例如,先用isnull =沒錯,然後下去。)。但是有一些編碼良好的循環,如果檢查,你可以這樣做。