7

我有模型 A 和 B,其中 B 对 A 有 FK。

我使用 django 1.3,我需要两个 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 吗?

在这种情况下,如所描述的文档中所述,无需更改查找,请执行以下操作(对于第一个,然后是相应的第二个):

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 回答