You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DRF中Django Filter实现单参数匹配多字段精确查询问题

实现DRF中django-filter单参数匹配多字段的OR精确查询

要让前端传入的id_no=<value>参数能匹配Customer模型中passport_no或nic_driving_license任一字段的精确值,默认的filterset_fields配置无法满足需求——因为它对多字段采用的是AND匹配逻辑。你需要自定义FilterSet来实现OR查询逻辑,具体步骤如下:

1. 自定义FilterSet类

创建一个继承自FilterSet的自定义过滤器类,通过method参数指定自定义过滤逻辑:

from django_filters import FilterSet, filters
from django.db.models import Q
from .models import Customer

class CustomerFilter(FilterSet):
    # 定义前端传入的id_no参数,关联自定义过滤方法
    id_no = filters.CharFilter(method='filter_id_no', label='ID Number')

    def filter_id_no(self, queryset, name, value):
        # 使用Q对象实现OR逻辑的精确匹配
        return queryset.filter(
            Q(passport_no__exact=value) | 
            Q(nic_driving_license__exact=value)
        )

    class Meta:
        model = Customer
        fields = []  # 若不需要其他默认过滤字段,留空即可;如需添加,在此列出

2. 在DRF视图中配置自定义FilterSet

将视图的filter_class指定为上面定义的CustomerFilter,以替换默认的过滤器配置:

示例:ModelViewSet配置

from rest_framework import viewsets
from .models import Customer
from .serializers import CustomerSerializer
from .filters import CustomerFilter

class CustomerViewSet(viewsets.ModelViewSet):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer
    filter_class = CustomerFilter

示例:ListAPIView配置

from rest_framework.generics import ListAPIView
from .models import Customer
from .serializers import CustomerSerializer
from .filters import CustomerFilter

class CustomerListView(ListAPIView):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer
    filter_class = CustomerFilter

配置完成后,前端传入id_no=XXX时,接口会返回所有passport_no精确等于XXX或nic_driving_license精确等于XXX的Customer实例,完美实现你需要的OR匹配逻辑。

内容的提问来源于stack exchange,提问作者Indika Rajapaksha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:53:09