7

モデル A と B があり、B には A への FK があります。

私はdjango 1.3を使用しており、2つのdjango管理フィルターが必要です:

1) a.b_set.exists() # (True/False)

2) not a.b_set.filter(some_condition=False).exists() # (True/False)

どうすればそれを達成できますか?悲しいことに、グーグルで解決策を見つけることができませんでした。

4

2 に答える 2

5

これを読む必要があります:Django 1.3以下のDjango Adminのカスタムフィルター

これはテストなしの私の最初の試みですが、多かれ少なかれそれがどのように行われたかを確認する必要があります-

from django.db import models
from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec
from django.utils.encoding import smart_unicode
from django.utils.translation import ugettext as _

class BNullSetFilterSpec(FilterSpec):

    def __init__(self, f, request, params, model, model_admin):
        super(BSetFilterSpec, self).__init__(f, request, params, model, model_admin)

        self.links = (
            ('Yes', {'b__isnull': False}),
            ('No', {}))

    def title(self):
        return _('B Set')

# registering the filter
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'empty_bset', False), BNullSetFilterSpec))
于 2012-12-04T15:27:02.213 に答える
1

@ptrckが言及したことは正しいです。1.4 に切り替えられませんでしたか?

この場合、説明されているドキュメントのように、ルックアップを変更する必要なく、次のようにします (最初はここで、次に 2 番目はそれに応じて):

from django.contrib.admin import BooleanFieldListFilter

class BInA(BooleanFieldListFilter):
    def queryset(self, request, queryset):
        if self.value() is True:
            return queryset.filter(a.b_set.exists())
        else:
            return queryset.filter(a.b_set.exists() is False)
于 2012-12-04T15:10:06.447 に答える