无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,提问作者Альберт Александров
相关产品推荐
相关产品推荐

