Django REST Framework过滤问题:实现Patient ID精确匹配
解决DRF中Patient ID精确匹配过滤的问题
嘿,我太懂你遇到的这个坑了——用SearchFilter做过滤的时候,它默认就是模糊子字符串匹配,所以查patientid=6会把所有带6的ID(比如26、60、168)都捞出来,完全不是你要的精确匹配效果。下面给你两种实用的解决方案:
方法一:用django-filter实现精确过滤(推荐)
这是DRF生态里做过滤最常用的工具,灵活性拉满,后续加其他过滤条件也方便。
- 先安装依赖:
pip install django-filter
- 在你的
api.py里定义一个FilterSet类,明确指定字段的精确匹配规则:
import django_filters from . import models from rest_framework import viewsets, permissions, serializers class RadiologypdfFilter(django_filters.FilterSet): # 用NumberFilter适配数字类型的patientid,指定exact实现精确匹配 patientid = django_filters.NumberFilter(field_name='patientid', lookup_expr='exact') radiology_id = django_filters.NumberFilter(field_name='radiology_id', lookup_expr='exact') class Meta: model = models.Radiologypdf fields = ['patientid', 'radiology_id']
- 修改你的ViewSet,替换过滤后端并关联上面的FilterSet:
class RadiologypdfViewSet(viewsets.ModelViewSet): """ViewSet for the radiology class""" queryset = models.Radiologypdf.objects.all() serializer_class = serializers.Radiologypdfserializerdata permission_classes = [permissions.IsAuthenticated] # 把原来的SearchFilter换成DjangoFilterBackend filter_backends = (django_filters.rest_framework.DjangoFilterBackend,) filter_class = RadiologypdfFilter
改完之后,发起GET /your-api-path/?patientid=6请求,就只会返回patientid严格等于6的结果了。
方法二:重写get_queryset实现精确过滤(无需第三方库)
如果不想额外装依赖,可以直接在ViewSet里手动控制查询逻辑:
class RadiologypdfViewSet(viewsets.ModelViewSet): """ViewSet for the radiology class""" queryset = models.Radiologypdf.objects.all() serializer_class = serializers.Radiologypdfserializerdata permission_classes = [permissions.IsAuthenticated] def get_queryset(self): # 先拿到基础的查询集 queryset = super().get_queryset() # 从请求参数里提取过滤条件 patientid = self.request.query_params.get('patientid') radiology_id = self.request.query_params.get('radiology_id') # 有patientid参数就添加精确过滤 if patientid: # 注意:如果patientid是字符串类型,去掉int()转换 queryset = queryset.filter(patientid=int(patientid)) if radiology_id: queryset = queryset.filter(radiology_id=int(radiology_id)) return queryset
这种方法不用加依赖,但如果以后要加更多过滤条件,代码会越来越臃肿,所以优先推荐第一种方案。
小提醒:如果你的
patientid是字符串类型(比如包含字母或特殊字符),记得把代码里的int(patientid)改成直接用patientid,避免类型转换报错。
内容的提问来源于stack exchange,提问作者Monica Das
相关产品推荐
相关产品推荐

