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

Mau*_*rgi 5 python django filter django-filter

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

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

provider = django_filters.ModelChoiceFilter(queryset=Provider.objects.all(), 
    widget=django_filters.widgets.LinkWidget) 
Run Code Online (Sandbox Code Playgroud)

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

Dmi*_*nko 3

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

f = SomeFilter(request.GET) 
f = SomeFilter(request.GET, queryset=f.qs)
Run Code Online (Sandbox Code Playgroud)

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

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

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