如何将嵌套类别添加到Django模型?

时间:2015-09-17 20:53:10

标签: python django django-models

我想要实现的是设计一个具有嵌套级别类别的模型。

级别是这样的。

category0 > category1 > category2 > category3 > category4 > category5

帖子的级别可以是0 - 5,因此帖子可以包含0 - 1类别,而其他帖子可能包含0 - 40 - 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。

由于

2 个答案:

答案 0 :(得分:8)

您可以使用Foreign Keyself方法吗?

例如:

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 ....