DRF ListAPIView如何在queryset中实现精确匹配的搜索筛选功能
问题排查
你的代码核心矛盾是路由配置的参数传递方式和视图的参数取值逻辑不匹配:
- urls.py 中你将
term定义为路径参数,对应请求形式为/funder/Hello World(空格会自动被URL编码) - 但views.py 中你是从查询参数(即URL后
?拼接的参数,对应请求形式为/funder?term=Hello World)中获取term,始终拿不到对应值,因此会返回全量数据。
修复方案
可任选以下一种方案调整,均能满足精确匹配的需求:
方案1:保留路径参数配置,修改视图取值逻辑
适配请求格式:GET /funder/搜索关键词
仅修改views.py即可:
class FunderViewSet(generics.ListAPIView): serializer_class = FunderSerializer def get_queryset(self): queryset = Funder.objects.all() # 从路径参数中取term值,使用self.kwargs获取 name = self.kwargs.get('term') if name is not None: # 此处默认就是精确匹配,完全符合你的需求 queryset = queryset.filter(Funder_name=name) return queryset
方案2:保留视图取值逻辑,修改路由配置
适配请求格式:GET /funder?term=搜索关键词,更符合搜索类接口的通用设计习惯
仅修改urls.py即可:
path( 'funder/', funder.FunderViewSet.as_view(), name='funder-lookup' ),
补充说明
两种方案的过滤逻辑默认都是精确匹配,如果你需要严格区分大小写匹配,只需确认你的数据库对应字段的排序规则为大小写敏感即可,无需额外调整代码。
内容的提问来源于stack exchange,提问作者user13533843
相关产品推荐
相关产品推荐

