简体   繁体   English

Django仅过滤特定于queryset的选项

[英]Django filters options specific to queryset only

I use django-filter to provide user filtering on a list view on my site, eg 我使用django-filter在我网站的列表视图上为用户提供过滤,例如

class MyModel(models.Model):
    fruit = models.ForeignKey(Fruit)
    price = models.CharField(...)
    release_date = models.DateTimeField(...)

class MyFilter(filters.FilterSet):
    ...

    class Meta:
        model = MyModel
        fields = ['fruit', 'price', 'release_date']

def my_banana_orange_view(request):
   ...
   queryset = MyModel.objects.filter(fruit__name__in=['banana', 'orange'])
   filter = Filter(request.GET, queryset=queryset)

   return render(request, 'my_template.html', {'queryset': queryset, 'filter': filter})

Now if I do this, I can display just the MyModel entries that have either banana or orange relationships, but MyFilter will still give the option of all the fruits in the Fruit model. 现在,如果执行此操作,则可以仅显示具有香蕉或橙色关系的MyModel条目,但是MyFilter仍将提供Fruit模型中所有水果的选项。 I'm trying to find a setting for a FilterSet to just show options related to the input queryset, but can't find one. 我正在尝试为FilterSet找到一个设置,使其仅显示与输入查询集相关的选项,但找不到一个。 Does one exist? 是否存在?

Otherwise I guess I would have to override the filter to do something like this: 否则,我想我必须重写过滤器才能执行以下操作:

class MyFilter(filters.FilterSet):

    def __init__(self, *args, **kwargs):
        super().__init__(self, *args, **kwargs)

        self.filters['fruit'].extra['queryset'] = Fruit.objects.filter(mymodel=self.queryset)

    class Meta:
        model = MyModel
        fields = ['fruit', 'price', 'release_date']

Which seems a bit overkill. 这似乎有点矫kill过正。 Only showing options based on the input queryset seems like desirable behaviour, but I can't find any documentation for it. 仅显示基于输入查询集的选项似乎是理想的行为,但是我找不到任何文档。 Is there a good way to do this? 有什么好方法吗? Any help appreciated! 任何帮助表示赞赏!

The first param for FilterSet is data , the second is queryset . FilterSet的第一个参数是data ,第二个参数是queryset

Try something along the lines of filter = MyFilter(data=request.GET, queryset=queryset) in your view. 在视图中尝试使用filter = MyFilter(data=request.GET, queryset=queryset)的方法。

See: http://django-filter.readthedocs.io/en/develop/guide/usage.html#the-view 请参阅: http : //django-filter.readthedocs.io/en/develop/guide/usage.html#the-view

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM