2010-04-15 2 views
0

Допустит, у меня есть этот класс (упрощенный):комплексы Джанго фильтр вопроса

class Tag (...): 
    children = models.ManyToManyField(null=True, symmetrical=False) 

Теперь я уже реализовал функцию get_parents, get_all_ancestors. Есть ли хороший питонический способ только для тегов верхнего уровня? Если бы я разработал свои теги по-разному (вместо этого указывая на родителей), я бы просто сделал get_all_parents().filter(children=None).

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

Но есть ли возможность с фильтрами или объектами Query делать то же самое (с меньшим количеством строк кода)?

Благодарим за помощь.

[править]

Когда она будет закончена, она должна быть иерархическая система мечения. У каждого тега могут быть дети, родители, но только дети сохраняются. Я хочу получить все теги верхнего уровня, которые указывают на многих дочерних/детских детей на мой тег.

+0

Можете ли вы проиллюстрировать пример того, как должен выглядеть ваш вывод данных? – viksit

+0

Мой вывод данных должен состоять из списка тегов или даже лучшего запроса. Их легко конвертировать, поэтому оба варианта подходят для моего случая. –

ответ

0

Поскольку у вас есть symmetrical=False, я думаю, что это должно работать, чтобы получить все теги, без родителей:

Tag.objects.filter(tag_set=None) 

Я должен сказать, хотя, что отношения ManyToMany не является идеальным для иерархической системы. Обычно элемент может иметь только один родительский элемент, но несколько дочерних элементов, т. Е. Это ForeignKey от дочернего к родительскому. Как у вас есть, каждый элемент может иметь несколько родителей и несколько детей, поэтому я не вижу, как возможно иерархическое отношение.

Как всегда, я рекомендую django-mptt управлять иерархическими данными.

+0

ah thx, я забыл tag_set. django-mptt не является выбором для меня, так как я хочу нескольких родителей. Таким образом, родители верхнего уровня могут быть похожими на категории. –

Смежные вопросы