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”标记。该应用程序在启动后无需添加类别。
答案 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)
这实际上取决于您的要求。如果您正在为只需要两级层次结构的系统编写程序,那么您所做的就完全没问题了。如果您可以想象一个可能有更复杂层次结构的时间,那么组合它们确实有意义。
你提到了一个'产品',对我来说这表明你想要一个严格的层次结构,所以你现在的模型看起来很好。