如何在Django REST Framework中定义searchFilter的查询URL路径
Django DRF 过滤接口404问题修复方案
你出现404的核心原因是:Django 的URL路由规则仅匹配URL中
?之前的路径部分,?之后的查询参数不需要写入path()的路由定义中,你将查询参数的规则硬编码到路由路径里,导致路径匹配失败。
- 第一步:修正URL配置
直接删除路由中查询参数相关的定义,仅保留基础路径即可:
# urls.py 修正后代码 path("api/search-products/", SearchProduct.as_view())
小提示:注意你的示例请求路径是
/api/search-products/(复数),路由配置时要和请求的路径拼写完全一致,避免因为单复数问题再次出现404。
- 第二步:调整视图过滤配置
你当前使用的SearchFilter是DRF自带的全局模糊搜索组件,仅支持?search=关键词的统一传参方式,无法实现?category=xxx&name=xxx的独立字段过滤。你已经安装了django-filter,直接替换过滤后端即可:
# views.py 修正后代码 from django_filters.rest_framework import DjangoFilterBackend class SearchProduct(generics.ListAPIView): serializer_class = ProductSerializer # 替换为DjangoFilterBackend实现独立字段过滤 filter_backends = [DjangoFilterBackend] # 声明允许过滤的字段,框架会自动生成对应参数的过滤逻辑 filterset_fields = ["category", "name"]
如果你同时需要保留全局模糊搜索能力,可以同时保留两个过滤后端:
filter_backends = [DjangoFilterBackend, filters.SearchFilter] filterset_fields = ["category", "name"] search_fields = ["category", "name"]
配置后即可同时支持两种查询方式:
- 独立字段过滤:
http://localhost:8000/api/search-products/?category=oil&name=mustard oil - 全局模糊搜索:
http://localhost:8000/api/search-products/?search=oil
- 第三步:接口验证
修改完成后直接访问目标格式的URL即可正常返回结果,不需要额外配置其他内容。
内容的提问来源于stack exchange,提问作者Abdullahil Kafi
相关产品推荐
相关产品推荐

