2012-05-10 61 views
1

我設置了2個模型文章和分類標準。 分類學是一個MPTTModel子類。Django admin + MPTT:如何在過濾父節點時顯示子節點?

除了一件事情之外,所有工作都正常:如果我選擇一個沒有文章鏈接的父節點,它將不會顯示鏈接到子節點的文章。

所以我想代碼我的自定義過濾器,但我卡住了queryset篩選。如何過濾此查詢集以顯示鏈接到子節點的所有文章如果我點擊父節點? :

class TaxonomyFilter(SimpleListFilter): 
    """ 
    Return incremented taxonomy list. Filtering by parent node display all children. 
    """ 
    title = ('Index') 
    parameter_name = 'node_id' 

    def lookups(self, request, model_admin): 
     taxos = Taxonomy.objects.all() 
     leafs = [] 
     for taxo in taxos: 
      leafs.append((taxo.id,(taxo.name))) 

     return leafs 


    def queryset(self,request,queryset): 
     """ 
     Filter list by displaying children if parent node has any. 
     """ 
     if self.value(): 
      return queryset.filter() 
     else: 
      return queryset 

回答

1

朱利葉斯:這是有點低-level,但確實不太查詢比您的解決方案(2而不是3)

def queryset(self, request, queryset): 
    """ 
    Filter list by displaying children if parent node has any. 
    """ 
    t = Taxonomy.objects.get(pk=self.value()) 

    return queryset.filter(taxonomy__lft__gte=t.lft, taxonomy__rght__lte=t.rght) 
+0

不錯!感謝這個想法 – Matthieu

2

不知道它是否可以回答我們自己的問題,但對於其他人在這裏面臨着同樣的問題,是「工作,但不是防彈」片斷

def queryset(self,request,queryset): 
    """ 
    Filter list by displaying children if parent node has any. 
    """ 
    descendants = Taxonomy.objects.get(pk=self.value()).get_descendants(include_self=True) 

    descendant_list = [] 
    for descendant in descendants: 
     descendant_list.append(descendant.id) 

    return queryset.filter(taxonomy__in=descendant_list) 
1

隨着django-mptt也有一些情況下,查詢由craigds描述可能無法正常工作,因爲左,右葉屬性在任何方面都不是唯一的。 爲了避免錯誤匹配,您可以使用自帶的django-mptttree_id領域:

t = Taxonomy.objects.get(pk=self.value()) 

return queryset.filter(
    taxonomy__tree_id=t.tree_id, 
    taxonomy__lft__gte=t.lft, 
    taxonomy__rght__lte=t.rght 
)