使用 django 过滤器,如何使用 OR 对多个字段进行查找?

emi*_*ir0 7 django django-filter

假设我想过滤一个内置的 djangoUser模型,但我只想在 1 个过滤器字段中这样做,而不是每个字段一个过滤器。也就是说,我想直接在过滤器字段中模拟 django 管理员search_fieldsdjango 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 中找不到它。

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

AXG*_*010 7

我使用 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)
        )
Run Code Online (Sandbox Code Playgroud)

然后确保针对新的过滤器字段 ( multi_name_fields ) 进行过滤,这应该返回您要查找的内容。