我想要实现的是设计一个具有嵌套级别类别的模型。
级别是这样的。
category0 > category1 > category2 > category3 > category4 > category5
帖子的级别可以是0 - 5
,因此帖子可以包含0 - 1
类别,而其他帖子可能包含0 - 4
或0 - 5
,
给定最高级别的类别(0
为较低级别,5
为最高级别)应继承自其下方的类别,(1 > 2 > 3 > 4 > 5
)
我怎么能做到这一点?
我目前的类别看起来像这样
class Category0(models.Model):
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=60)
class Category1(models.Model):
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=60)
parent = models.ForeignKey(Category0)
class Category2(models.Model):
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=60)
parent = models.ForeignKey(Category1)
class Category3(models.Model):
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=60)
parent = models.ForeignKey(Category2)
class Category4(models.Model):
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=60)
parent = models.ForeignKey(Category3)
class Category5(models.Model):
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=60)
parent = models.ForeignKey(Category4)
这里的帖子模型
class Product(models.Model):
title = models.CharField(max_length=20)
slug = AutoSlugField(unique=True, populate_from='title')
content = models.TextField(blank=True)
category = models.ForeignKey(CategoryChild4)
最好的方法是什么?任何建议或变更欢迎。
更新
后端是PostgrSQL。
由于
答案 0 :(得分:8)
您可以使用Foreign Key
到self
方法吗?
例如:
class Category(models.Model):
parent = models.ForeignKey('self', default=None, null=True, blank=True, related_name='nested_category')
nesting_level = models.IntegerField()
name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=60)
使用nesting_level
显式跟踪嵌套级别可能很有用,但这样您就可以创建所描述的关系。
答案 1 :(得分:-4)
如果您使用Postgres作为数据库,我可能不会采用这种方法。我将研究使用新的json数据类型(postgres 9.3>)。如果你想利用它,你可以以文档形式存储这种类型的信息(想想mongo-db,但在RDBMS中)。我建议安装此字段:
https://github.com/bradjasper/django-jsonfield/
唯一的缺点是你需要自己进行验证,但由于这是一个多层模型,你可能需要根据你上面的方式做到这一点。
您也可以考虑使用MongoDB ....