首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django-filters,如何使用OR在多个字段上进行查找?

使用django-filters,如何使用OR在多个字段上进行查找?
EN

Stack Overflow用户
提问于 2018-02-06 01:57:49
回答 2查看 3.3K关注 0票数 7

假设我想要过滤一个内置的django User模型,但我只想在一个过滤器字段中这样做,而不是每个字段一个过滤器。也就是说,我想要直接在过滤器字段中模拟django admin的search_fields (django admin search_fields docs)的行为。

因此,举个例子,我不是先为field_name='first_name'设置一个过滤器,然后再为field_name'last_name'创建一个过滤器,依此类推,我想做一些类似field_name=['first_name', 'last_name', 'email', 'username']的事情,其中可以使用相同的lookup_expr='icontains'。那么查询就是一个简单的OR查找。这是内置的吗?我在django-filter docs里找不到它。

或者我必须为此自定义过滤器。这似乎是一个非常常见的用例。

EN

回答 2

Stack Overflow用户

发布于 2018-10-15 23:37:31

我通过使用Q对象的自定义过滤器做到了这一点。

代码语言:javascript
复制
import django_filters
from django.db.models import Q

class UserFilter(django_filters.FilterSet):
    multi_name_fields = django_filters.CharFilter(method='filter_by_all_name_fields')

    class Meta:
        model = User
        fields = []

    def filter_by_all_name_fields(self, queryset, name, value):
        return queryset.filter(
            Q(first_name__icontains=value) | Q(last_name__icontains=value) | Q(username__icontains=value) | Q(email__icontains=value)
        )

然后确保根据新的filter字段(multi_name_fields)进行过滤,这应该会返回您正在查找的内容。

票数 8
EN

Stack Overflow用户

发布于 2019-10-18 14:23:57

我也做过类似的事情。这应该会有帮助:

代码语言:javascript
复制
def filter_by_all_name_fields(self, queryset, name, value):
"""
Split the filter value into separate search terms and construct a set of queries from this. The set of queries
includes an icontains lookup for the lookup fields for each of the search terms. The set of queries is then joined
with the OR operator.
"""
lookups = ['first_name__icontains', 'last_name__icontains', 'username__icontains', 'email__icontains',]

or_queries = [Q(**{lookup: value}) for lookup in lookups]

return queryset.filter(reduce(operator.or_, or_queries))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48628647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档