1

我设置了 2 个模型文章和分类。分类是一个 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
4

3 回答 3

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)
于 2012-05-10T12:28:57.187 回答
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)
于 2012-05-12T13:38:43.407 回答
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
)
于 2013-04-07T19:24:10.500 回答