如何从多个字段中搜索?

Nip*_*ips 2 django-filter django-rest-framework

我的视图集有自定义过滤器:

class OrderFilter(django_filters.rest_framework.FilterSet):
    username = django_filters.CharFilter(name='user__username', lookup_expr='icontains')
    client_name = django_filters.CharFilter(name='user__first_name', lookup_expr='icontains')

    class Meta:
        model = Order
        exclude = ['pk']
Run Code Online (Sandbox Code Playgroud)

当我发送这样的查询时它会起作用:

http://localhost:8000/orders/?username=testuser
Run Code Online (Sandbox Code Playgroud)

或者

http://localhost:8000/orders/?client_name=john
Run Code Online (Sandbox Code Playgroud)

但我只想创建一个查询来搜索包含username,first_name和中的搜索字符串的数据last_name。怎么做?

She*_*rpa 5

对于无法由单个过滤器表达的复杂行为的一般包罗万象是使用method过滤器类 ( docs )的参数。

一个可能的实现:

from django_filters import rest_framework as filters
from django.db.models import Q


class OrderFilter(filters.FilterSet):
    search = filters.CharFilter(method='search_filter')

    def search_filter(self, queryset, name, value):
        return queryset.filter(Q(username__icontains=value) 
                               | Q(first_name__icontains=value) 
                               | Q(last_name__icontains=value))
Run Code Online (Sandbox Code Playgroud)