Skip to main content
 首页 » 编程设计

python之改变 django-filter 默认行为

2025年05月04日23powertoolsteam

这是一个 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 端覆盖该行为。