这是一个 django-filter应用特定的客人。
有没有人试过引入条件让过滤器根据条件进行查询?
举个例子:
假设我们有一个Product 模型。可以根据名称和价格进行筛选。
默认的 django-filter 行为是,当我们使用更多过滤器并将它们链接在一起时,它们使用 AND 语句过滤数据(它缩小了搜索范围)。
我想更改此行为并添加一个 ChoiceFilter,比如有两个选项:AND 以及 OR。从这一点来看,过滤器应该根据用户的选择来工作。
例如。如果用户查询带有 name__startswith="Juice" OR price__lte=10.00 的产品,它应该列出名称以 开头的所有产品>果汁 以及价格低于10.00 的产品。
Django-filter 文档说过滤器可以接受一个参数:
action
An optional callable that tells the filter how to handle the queryset. It recieves a
QuerySet and the value to filter on and should return a Queryset that is filtered
appropriately.
这似乎是我要找的东西,但文档没有任何进一步的解释。有什么建议吗?
@编辑:
这是views.py:
def product_list(request):
f = ProductFilter(request.GET, queryset=Product.objects.all())
return render_to_response('my_app/template.html', {'filter': f})
请您参考如下方法:
由于最终查询集的构造方式,很难将每个过滤器组合在一起。本质上,代码是这样工作的:
过滤器集,filterset.py line 253 :
@property
def qs(self):
qs = self.queryset.all()
for filter_ in self.filters():
qs = filter_.filter(qs)
过滤器,filters.py line 253 :
def filter(self, qs):
return qs.filter(name=self.value)
每个过滤器都可以决定如何将自己应用于传入的查询集,并且所有过滤器,如当前实现的那样,使用 AND 来过滤传入的查询集。您可以创建一组新的过滤器,将它们自身与传入的查询集进行或运算,但是无法从 FilterSet 端覆盖该行为。
