А как насчет неограниченных уровней? На 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
. Не беспокойтесь о производительности, мой лучший совет: не пытайтесь оптимизировать элегантное решение перед профилированием (вы будете удивлены).