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



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

Код мудрый я думал что-то например:

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

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

Спасибо!

65   3  

3 ответов:

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

Например, если у вас есть следующее: текст 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 так же, как она используется на странице, на которую вы ссылаетесь, казалось бы, что категория " TV "будет экземпляром Category с нулевым значением parent, а "Plasma" и " 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))
    Ничего не найдено.

Добавить ответ:
Отменить.