隐藏在django-filter中产生零结果的过滤器项

时间:2010-02-02 09:36:47

标签: python django filter django-filter

我对django-filter应用程序有一个问题:如何隐藏将产生零结果的项目。我认为有一种简单的方法可以做到这一点,但是idk如何。

我在ModelChoiceFilter上使用LinkWidget,如下所示:

provider = django_filters.ModelChoiceFilter(queryset=Provider.objects.all(), 
    widget=django_filters.widgets.LinkWidget) 

我需要做的是过滤查询集并仅选择将产生至少一个结果的Provider,并排除其他结果。 有办法做到这一点吗?

3 个答案:

答案 0 :(得分:3)

基本上,您需要应用过滤器,然后再次应用它们,但是在新生成的查询集上。像这样:

f = SomeFilter(request.GET) 
f = SomeFilter(request.GET, queryset=f.qs)

现在,当您拥有正确的查询集时,您可以在 init 中动态覆盖提供程序:

def __init__(self, **kw):
   super(SomeFilter, self).__init__(**kw)
   self.filters['provider'].extra['queryset'] = Provider.objects.filter(foo__in=self.queryset)

不漂亮,但它有效。您应该将这两个调用封装在过滤器上更有效的方法中。

答案 1 :(得分:0)

也许查询集可以是可调用的而不是“真实的”查询集对象。这样,它可以动态生成。至少这在Django模型中适用于其他模型的引用。

callable可以是Model中的类方法。

答案 2 :(得分:0)

如果我理解你的问题,我相信你想要使用AllValuesFilter。

import django_tables

provider = django_filters.AllValuesFilter(
    widget=django_filters.widgets.LinkWidget)

此处提供了更多信息:http://github.com/alex/django-filter/blob/master/docs/ref/filters.txt#L77