2010-01-13 2 views
7

Я пытаюсь использовать аналогичную реализацию категории до this one в Django Wiki. Мне интересно, как Django выполняет поиск, чтобы вытащить все объекты, связанные с родительской категорией. Например, если у меня есть категория «ТВ», и у нее есть подкатегории «LED», «LCD» и «Plasma», как бы я мог бы легко запросить для всех телевизоров без рекурсивного просмотра всех подкатегорий и подкатегорий (если там любые).Django Категория и подкатегория:

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

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

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

Спасибо!

+0

Могут ли предметы быть в нескольких категориях? – czarchaic

+0

Нет, они могут быть только в одной категории, но тогда они также будут отделены от родительской категории (вроде как наследования) –

ответ

8

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

Например, если у вас есть следующее: alt text 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')

5

Предполагая, что вы используете Category модель так же, как он используется на странице ссылочного, казалось бы, что категория «ТВ» будет Category экземпляр с нулевым 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() 

Получить Item QuerySet

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

или

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

выглядит ли это как это на стадионах того, что вам нужно?

+0

Будет ли это иметь возможность делать sububcategories? Например, если Vizio действительно была другой категорией, а затем был такой элемент: specific_model_number = Item (name = "model43534", category = vizio) не будет "items = Item.objects.filter (category__parent = tv) " не вернуть объект specific_model_number в результирующий набор? –

+0

Можете ли вы отредактировать свое сообщение или добавить ответ с типом кода, который вы будете использовать, и указать свои проблемы? Я пытаюсь понять, что вам нужно. Например, в запросе, указанном выше, при прохождении через него каждый элемент будет иметь имя и «Категория». Возможно ли в вашей заявке, чтобы категория имела 'vizio' в качестве родителя (т. Е. Подкатегории)? – czarchaic

+0

Да, категория может иметь vizio в качестве родителя. Меня беспокоит, что запрос не возвращает каждый элемент в подмножестве дерева категорий. Если бы у меня был запрос для «category__parent = tv», я бы получил все возвращаемые элементы «vizio», хотя они были двумя узлами вниз по дереву? Я не знаю, как отредактировать сообщение, чтобы объяснить это лучше, поэтому я извиняюсь, потому что это запутывает, и я действительно ценю вашу помощь до сих пор. –

0

Если вы используете Джанго -категории, в которых используется MPTT, вы можете сделать следующее:

Entry.objects.filter(category__in=category.get_descendants(True)) 
Смежные вопросы