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

Django REST Framework过滤问题:实现Patient ID精确匹配

解决DRF中Patient ID精确匹配过滤的问题

嘿,我太懂你遇到的这个坑了——用SearchFilter做过滤的时候,它默认就是模糊子字符串匹配,所以查patientid=6会把所有带6的ID(比如26、60、168)都捞出来,完全不是你要的精确匹配效果。下面给你两种实用的解决方案:

方法一:用django-filter实现精确过滤(推荐)

这是DRF生态里做过滤最常用的工具,灵活性拉满,后续加其他过滤条件也方便。

  1. 先安装依赖:
pip install django-filter
  1. 在你的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']
  1. 修改你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:49:24