Джанго категории, подкатегории и подкатегории - PullRequest
4 голосов
/ 29 февраля 2012

У меня есть простая модель категории:

class Category(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField()
    parent = models.ForeignKey('self', blank = True, null = True, related_name="children")

Сначала мои данные, казалось, нуждались только в категориях и подкатегориях, но я понял, что в некоторых случаях я все еще хочу подразделить на подкатегории.

Я хочу, чтобы мои URL были категорией / подкатегорией / подкатегорией

Я думал о том, как это реализовать, но я не уверен, так как мое сопоставление с шаблоном URL выглядит так:

url(r'^business/(?P<parent>[-\w]+)/(?P<category_name>[-\w]+)$', 'directory.views.show_category'),

В основном разрешено использование только одной подкатегории, поскольку мой метод представления принимает эти два параметра.

Каков наилучший способ справиться с этим?

1 Ответ

14 голосов
/ 29 февраля 2012

А как насчет неограниченных уровней? На urls.py:

url(r'^business/(?P<hierarchy>.+)/', 'directory.views.show_category')

И в каталоге / views.py:

def show_category(request, hierarchy):
    category_slugs = hierarchy.split('/')
    categories = []
    for slug in category_slugs:
        if not categories:
            parent = None
        else:
            parent = categories[-1]
        category = get_object_or_404(Category, slug=slug, parent=parent)
        categories.append(category)
    ...

Не забудьте добавить unique_together = ('slug', 'parent',) в Category.Meta, иначе вы обречены.

[обновление]

Могу ли я просто запросить базу данных с category_slugs [-1], и если полученная категория не имеет дочерних элементов, мы знаем, что это листовая категория, в противном случае мы знаем, что у нее есть подкатегории, и мы показываем их? - alexBrand

@ alexBrand: рассмотрим следующие гипотетические URL:

/business/manufacture/frozen/pizza/
/business/restaurant/italian/pizza/
/business/delivery-only/italian/pizza/
/business/sports/eating-contest/pizza/

Если вы считаете, что такой сценарий возможен, то ИМХО более простого теста (без всей иерархии) недостаточно.

Каковы ваши реальные опасения относительно предложенного решения? В конце цикла категория переменных будет содержать правильный category_slugs[-1], и у вас будет вся иерархия, доступная в categories. Не беспокойтесь о производительности, мой лучший совет: не пытайтесь оптимизировать элегантное решение перед профилированием (вы будете удивлены).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...