2013-11-26 3 views
0

im работает в чем-то подобном на Django: МОДЕЛИ имеет эту структуру.получить Гранд-родитель Django

Category 
    - name 
    - parent category 

И мне было интересно, возможно ли получить основного родителя (грандиозного родителя) только в одном запросе. например:

Category.objects.get(pk = 10, absolutefirstoneofall) 

для примера я получил это.

Computers 
- Laptops 
    - branch 
    - seller 

, если я получу продавец, я хочу теперь и основную категорию. эти данные не являются реальностью, это всего лишь пример.

Спасибо, что поддержали друзей.

+1

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

ответ

2

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

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

from treebeard import NSNode 

class Category(NSNode): 
    name = models.CharField(max_length=64) 
    # ... 

Чтобы получить все корневые узлы:

Category.get_root_nodes() 

возвращается [<Category: Computers>]

Чтобы получить список предков узла:

Category.objects.get(name="seller").get_ancestors() 

возвращается [<Category: branch>, <Category: Laptops>, <Category: Computers>]

Чтобы получить корневой узел дерева, который имеет данный узел:

Category.objects.get(name="seller").get_root() 

возвращает <Category: Computers>

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