假设我想要过滤一个内置的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里找不到它。
或者我必须为此自定义过滤器。这似乎是一个非常常见的用例。
发布于 2018-10-15 23:37:31
我通过使用Q对象的自定义过滤器做到了这一点。
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)进行过滤,这应该会返回您正在查找的内容。
发布于 2019-10-18 14:23:57
我也做过类似的事情。这应该会有帮助:
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))https://stackoverflow.com/questions/48628647
复制相似问题