Поиск категорий и подкатегорий Django

Я пытаюсь использовать аналогичную реализацию категории для этот в Вики Django. Мне интересно, как Django выполняет поиск, чтобы вытащить все объекты, связанные с родительской категорией. Например, если у меня есть категория "телевизор", и у нее есть подкатегории "LED", "LCD" и "Plasma", как я могу легко запросить все телевизоры без рекурсивного прохождения всех подкатегорий и подкатегорий (если они есть).

код мудрый я был думая что-то вроде:

class Item(models.Model):
   name = ...
   ...
   category = models.ForeignKey(Category, null=True, blank=True)

Итак, с этим типом реализации есть ли простой способ сделать то, что мне нужно, или есть какое-либо другое лучшее решение?

спасибо!

3 ответов


Если вы хотите применять строгие категории и подкатегории, но также имеете возможность выполнять быстрый поиск с результатами, как вы описываете, вы можете сделать таблицу "тег", где вы фактически не позволяете пользователям помечать элементы сами, но, скорее, как только вы назначаете категорию элементу, вы заполняете таблицу тегов для этого элемента со всеми родительскими категориями до корневого узла дерева категорий.

например, если у вас есть следующие: alt-текст http://img509.yfrog.com/img509/9845/photoho.jpg

таблица тегов будет выглядеть примерно так:

   id   |   tag_name   |   tv_id
   1    |     "tv"     |     1
   2    |     "sd"     |     1    
   3    |     "crt"    |     1  
   4    |     "tv"     |     2  
   5    |     "HD"     |     2  
   6    |     "LCD"    |     2  
   7    |     "tv"     |     3  
   8    |     "HD"     |     3  
   9    |   "plasma"   |     3

теперь ваш queryset будет выглядеть как items=Item.objects.filter(tag='TV')


предполагая, что вы используете Category модель так же, как она используется на странице, на которую вы ссылались, казалось бы, что категория "телевизор" будет Category экземпляр с null parent, и "плазма" & " LCD " были бы Category экземпляры с категорией " TV " в качестве родителя.

>>> tv=Category(name="TV")
>>> tv.save()
>>> lcd=Category(name="LCD", parent=tv)
>>> lcd.save()
>>> plasma=Category(name="Plasma", parent=tv)
>>> plasma.save()

создать несколько элементов

>>> vizio=Item(name="Vizio", category=lcd)
>>> vizio.save()
>>> plasmatron=Item(name="PlasmaTron", category=plasma)
>>> plasmatron.save()

получить элемент queryset

>>> items=Item.objects.filter(category__parent=tv)

или

>>>> items=Item.objects.filter(category__parent__name='TV')

похоже ли это на то, что вам нужно?


Если вы используете django-categories, который использует MPTT, вы можете сделать следующее:

Entry.objects.filter(category__in=category.get_descendants(True))