1

Article と Taxonomy の 2 つのモデルを設定しました。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
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: これは少し低レベルですが、ソリューションよりも少ないクエリを実行します (3 ではなく 2)

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 に答える