• 23 Июл
  • 2015
Дерево категорий в Django

Наверное в большинстве проектов приходится иметь дело с категориями чего-либо. Самый распространенный пример - это категории товаров или категории статей. Простой способ - сделать модель с категориями и ForeignKey из модели тавара на модель категорий. Но есть одно весьма печальное ограничение - так не получится сделать многоуровневые категории. Однако, если вы используете PostgreSQL, тогда у вас есть замечательная возможность обойти эту проблему. Для этого устанавливаем django-mptt. (О данной возможности в других СУБД не слышал, скорее всего тоже есть методы обхода данного ограничения)

Теперь создаем модель, в которой обязательно должно присутствовать поле parent и ссылаться на само себя. Для этой цели лучше использовать TreeForeignKey из пакета mptt.models.


from django.db import models
from mptt.models import MPTTModel, TreeForeignKey

class Category(MPTTModel):
    name = models.CharField(max_length=128, unique=True)
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)

    def __unicode__(self):
        return self.name

Теперь делаем syncdb или миграцию и наслаждаемся. Также есть удобная возможность построить дерево объектов в админке Django, но об этом напишу в следующий раз.

comments powered by Disqus