2015-10-26 104 views
9

Próbuję uzyskać obiektów wszystkich dzieci danego węzła w Django Django-MPPTJak mogę zapytać obiektów wszystkich dzieci węzła z Django mptt?

Mam modelu zaprojektowanego tak jak pokazano poniżej, klasy/kategorie (Node) z tym samym poziomie wcięcia definiuje rodzeństwo , wewnętrzne wcięcia są dziećmi. Obiekty oznaczone kategorią są wyświetlane tuż pod kategorią (węzeł). Obiekty zaczynają się od symbolu -. Liczby wzdłuż klas/kategorii (węzłów) są identyfikatorami.

wszystkie węzły są instancjami klasy Category z podanym id.

high school (1) 
    class 8 (2) 
     division a (3) 
      -Billie 
      -Tre 
      -Mike 

     division b (4) 
      -Patrik 
      -Pete 
      -Andy 
    class 9 (3) 
     division a (8) 
      -Mark 
      -Tom 
      -Travis 

     division b (5) 
      -Gerard 
      -Frank 
      -Mikey 

    class 10 (4) 
     division a (6) 
      -Hayley 
      -Jeremy 
      -Taylor 

     division b (7) 
      -Steven 
      -Slash 
      -Izzy 

mogę zestawów kwerendy określonego węzła w ten sposób,

>>> Category.objects.get(pk=7).product_set.all() 
[Steven, Slash, Izzy] 


>>> Category.objects.get(pk=4).product_set.all() 
[Mark, Tom, Travis] 

Jak mogę kwerendy z pk=1, pk=2, pk=3 lub pk=4 aby wszystkie obiekty podrzędne?

przykład,

zapytanie do pk=2 zapytania musi powrócić

[Billie, Tre, Mike, Patrik, Pete, Andy] 
+0

Twój przykład wydaje się związane z węzła pk = 2, albo coś mi umknęło? – sax

+0

@sax tak, to jest literówka, naprawiłem. – Rivadiz

+0

@Ivan poziomy będą różne – Rivadiz

Odpowiedz

3

Django mptt udostępnia dwie metody do pobierania dzieci.

Z docs

MPTTModel.get_children (* args, ** kwargs)

zwraca QuerySet zawierającą natychmiastowe dzieci tego modelu> Przykładowo, w kolejności drzewa.

Zaletą stosowania tej metody w stosunku do odwrotnej relacji dostarczanej przez ORM do potomków instancji jest to, że można uniknąć zapytania do bazy danych w przypadku, gdy instancja jest węzłem liści (nie ma dzieci).

Po wywołaniu z szablonu, w którym drzewo zostało przeszukane przez filtr cache_tree_children, zapytanie o bazę danych nie jest wymagane.

I

MPTTModel.get_leafnodes (* args, ** kwargs)

tworzy QuerySet zawierający leafnodes tego modelu przykład w kolejności drzewa.

Jeśli include_self to prawda, że ​​QuerySet obejmie również wystąpienie tego modelu (jeśli jest to węzeł liść)

Nie jestem pewien, w jaki sposób modele są ustawione, ale nie jestem pewien, dlaczego użyj mptt tutaj. Używasz kategorii/produktu, ale wydaje się, że jest to uczeń lub ludzie i grupy robocze.

Może można zdefiniować EstablishmentLevel, Level|, StudentGroup, Student modele i zamiast korzystać z funkcji mptt coś zapytania jak:

Student.objects.filter(studentgroup__level__pk=1) 

Zobacz Django doc

nadzieję, że pomogło

14
Category.objects.get(pk=2).get_descendants(include_self=True) 

W ten sposób otrzymasz wszystkich potomków kategorii, w tym siebie.

Zakładając, że model Produkt posiada kategorię obcego klucza, można użyć:

Product.objects.filter(category__in=Category.objects.get(pk=2)\ 
    .get_descendants(include_self=True)) 
+0

Potomkowie z jakiego pola? W jaki sposób kategoria zna tylko pobranie potomków z produktu? Co jeśli kategoria ma również potomków z Widget? Czy pobieranie z obu z nich, czy trzeba określić, który z nich pobrać? – kloddant