Django与模型关系的最佳实践

时间:2011-02-16 13:30:29

标签: django django-models

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)

以上是组织关系的最佳实践,还是应该将cat / sub cat的模型组合起来,使其更像是标记系统?例如,产品可以用“Cat A”和“Sub Cat A”标记。该应用程序在启动后无需添加类别。

3 个答案:

答案 0 :(得分: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 = True过滤类别) ,然后往下走。)但是有一些编码良好的循环,如果有检查,你就可以做到。

答案 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)

答案 2 :(得分:1)

这实际上取决于您的要求。如果您正在为只需要两级层次结构的系统编写程序,那么您所做的就完全没问题了。如果您可以想象一个可能有更复杂层次结构的时间,那么组合它们确实有意义。

你提到了一个'产品',对我来说这表明你想要一个严格的层次结构,所以你现在的模型看起来很好。