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
相关产品推荐
相关产品推荐

