2015-09-17 3 views
3

Я пытаюсь создать модель, которая имеет вложенные уровни категорий.Как добавить вложенные категории в модель Django?

Уровни такие.

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) 

Что бы лучший метод? любые предложения или изменения приветствуются.

Update

Бэкэнд является PostgrSQL.

Благодаря

+4

посмотрите на [django-mptt] (https://github.com/django-mptt/django-mptt/) –

ответ

6

Не могли бы вы использовать 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, но таким образом, вы можете создать отношения, которые Вы описали.

-3

Если вы используете Postgres в качестве базы данных, я, вероятно, не будет принимать этот подход. Я бы рассмотрел использование нового типа данных json (postgres 9.3>). Если вы хотите использовать это, вы можете сохранить этот тип информации в форме документа (подумайте о mongo-db, но в СУБД). Я рекомендую установить это поле:

https://github.com/bradjasper/django-jsonfield/

Единственным недостатком является то, что вам нужно выполнить проверку самостоятельно, но так как это в многослойной модели, вы, вероятно, должны были бы сделать это так или иначе основаны на том, как вы делаете это выше.

Вы можете посмотреть в использовании MongoDB также ....

+4

Почему бы вам посоветовать использовать модель базы данных без ссылки, не зная деталей проекта, или любой базы данных вообще? Если все потребности op - это иерархия parent-child, ваше направление бессмысленно, это возможно с любым бэкэндом и довольно распространенным –

+0

в порядке с демпингом json, но могу ли я получить все объекты, относящиеся к определенной категории? (например, 'category3')? – Marty

Смежные вопросы