2015-10-26 59 views
9

我試圖讓Django給定節點的所有孩子的對象與Django-mppt如何使用Django mptt查詢節點的所有子節點的對象?

我有一個模型設計如下所示,類/類別(節點)具有相同的縮進級別定義兄弟姐妹,內縮是兒童。標有類別的對象顯示在類別(節點)的正下方。對象以-符號開頭。沿類/類別(節點)的數字是ID。

所有節點都是Category類的實例,給出了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 

我可以得到查詢集的特定節點的這種方式,

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


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

如何與pk=1pk=2pk=3pk=4查詢來獲取所有子對象?

例如,

pk=2查詢的查詢必須返回

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

您的例子似乎與PK = 2到節點相關的,或我錯過了什麼? – sax

+0

@sax是啊,這是一個錯字,已修復。 – Rivadiz

+0

@Ivan的水平會有所不同 – Rivadiz

回答

3

Django的MPTT提供了兩種方法來獲取孩子。

docs

MPTTModel.get_children(* ARGS,** kwargs)

返回包含此模型的直接孩子一個QuerySet>例如,在樹的順序。

使用此方法優於ORM提供給實例子項的反向關係的好處是,在實例是葉節點(它沒有子項)的情況下,可以避免數據庫查詢。

如果通過cache_tree_children過濾器遍歷樹的模板進行調用,則不需要數據庫查詢。

而且

MPTTModel.get_leafnodes(* ARGS,** kwargs)

創建一個包含這個模型實例的葉節點一個QuerySet,按照樹形結構順序。

如果include_self爲True,查詢集也將包括這個模型實例(如果它是葉節點)

我不知道你是如何模型成立,但我不知道爲什麼你在這裏使用mptt。您正在使用類別/產品,但它似乎是學生或人員和工作組。

也許你可以定義EstablishmentLevelLevel|StudentGroupStudent模型,而不是使用MPTT功能查詢是這樣的:

Student.objects.filter(studentgroup__level__pk=1) 

Django doc

希望有所幫助

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

這會讓你的所有類別的後代包括自我。

假設您的產品型號有外鍵的類別,你可以使用:

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

後裔從什麼領域,但? Category只知道如何從產品中獲取後代?如果Category還有Widget的後代呢?它是從這兩個中獲取的,還是您必須指定從哪個中獲取? – kloddant

相關問題