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

无Django Model时,如何定义DRF过滤类实现字典列表过滤并支持Swagger?

无Django Model时实现DRF多字段过滤类(支持Swagger显示)

直接通过继承BaseFilterBackend自定义过滤类,既可以处理字典列表的过滤逻辑,又能通过重写方法让Swagger识别查询参数,具体实现如下:

1. 自定义过滤类

继承DRF的BaseFilterBackend,重写两个核心方法:

  • filter_queryset:处理从查询参数获取的过滤条件,对远程返回的字典列表进行过滤
  • get_schema_fields:定义Swagger需要显示的查询参数
from rest_framework.filters import BaseFilterBackend
from drf_yasg import openapi

class RemoteUserFilter(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # 从请求查询参数中获取过滤条件
        first_name = request.query_params.get('first_name')
        last_name = request.query_params.get('last_name')

        filtered_data = queryset
        # 按first_name过滤(示例为大小写不敏感的精确匹配,可改为模糊匹配)
        if first_name:
            filtered_data = [
                user for user in filtered_data 
                if user.get('first_name', '').lower() == first_name.lower()
            ]
        # 按last_name过滤
        if last_name:
            filtered_data = [
                user for user in filtered_data 
                if user.get('last_name', '').lower() == last_name.lower()
            ]

        return filtered_data

    def get_schema_fields(self, view):
        # 定义Swagger显示的查询参数
        return [
            openapi.Parameter(
                name='first_name',
                in_=openapi.IN_QUERY,
                type=openapi.TYPE_STRING,
                description='按名字过滤(支持大小写不敏感匹配)',
                required=False
            ),
            openapi.Parameter(
                name='last_name',
                in_=openapi.IN_QUERY,
                type=openapi.TYPE_STRING,
                description='按姓氏过滤(支持大小写不敏感匹配)',
                required=False
            )
        ]

2. 在视图中应用过滤类

在RemoteUsersView中指定filter_backends为自定义的过滤类,然后在list方法中对远程返回的数据应用过滤:

from rest_framework.views import APIView
from rest_framework.response import Response

class RemoteUsersView(APIView):
    filter_backends = [RemoteUserFilter]

    def list(self, request):
        # 调用SAP服务获取原始字典列表
        remote_users = self._fetch_sap_users()
        # 应用过滤逻辑
        filtered_users = self.filter_queryset(request, remote_users, self)
        return Response(filtered_users)

    def _fetch_sap_users(self):
        # 模拟从SAP服务获取的数据,实际替换为真实调用逻辑
        return [
            {'first_name': 'John', 'last_name': 'Doe'},
            {'first_name': 'Jane', 'last_name': 'Smith'},
            {'first_name': 'John', 'last_name': 'Smith'}
        ]

扩展说明

  • 若需要模糊匹配,可将过滤逻辑中的==改为in或使用字符串的contains方法(需处理空值情况)
  • 如需支持更多过滤条件,只需在filter_queryset中添加对应参数的处理逻辑,并在get_schema_fields中新增参数定义
  • 确保已正确安装并配置drf-yasg包,否则Swagger无法显示自定义的查询参数

内容的提问来源于stack exchange,提问作者Альберт Александров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:49:11