Django admin + MPTT:过滤父节点时如何显示子节点?

时间:2012-05-10 08:07:14

标签: django-admin django-mptt

我设置了2个模型Article和Taxonomy。 分类法是MPTTModel子类。

一切正常,除了一件事:如果我选择没有链接到它的文章的父节点,它将不会显示链接到子节点的文章。

所以我正在尝试编写自定义过滤器,但是我遇到了查询集过滤问题。如何过滤此查询集以显示链接到子节点的所有文章如果我单击父节点? :

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

3 个答案:

答案 0 :(得分: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 :(得分:1)

Julius:这是一个较低级别,但查询次数少于您的解决方案(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)

答案 2 :(得分:1)

对于django-mptt,有些情况下craigds描述的查询可能不起作用,因为左右叶属性在任何方面都不是唯一的。 为避免错误匹配,您可以使用tree_id附带的django-mptt字段:

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
)