Django REST Framework如何配置URL模式接收查询字符串参数
问题原因
你配置后出现404的核心原因是:Django的路由匹配规则仅识别?之前的路径部分,查询参数(即URL中?之后拼接的键值对)不需要、也不能写在path()的路由规则里。你之前把?year=<int:year>写到路由pattern中,相当于要求路径里必须硬编码包含?year=xxx的字符串段才会匹配,正常请求的查询参数不会参与路径匹配,自然会命中不到路由返回404。
正确修改步骤
1. 调整urls.py路由配置
移除路由规则里的year路径参数段,只保留project_handle的路径匹配即可,正确配置如下:
# 注意末尾保留斜杠,和Django默认的APPEND_SLASH配置兼容,避免不必要的重定向 path("api/projects/<str:project_handle>/", your_view_function)
2. 调整视图层参数获取逻辑
查询参数不属于路径关键字参数,不能通过self.kwargs.get()获取,要从请求对象的查询参数集合中取值:
- 如果是普通Django函数视图:通过
request.GET.get("year")获取 - 如果是DRF类视图:用你之前写的
self.request.query_params.get("year")即可
注意:从查询参数中拿到的值默认是字符串类型,如果需要整数类型的year,需要自行做类型转换,同时建议补充参数缺省值、类型非法的异常处理逻辑。
验证方式
修改完成后重启Django服务,访问http://localhost:8000/api/projects/abcml/?year=2021即可正常命中路由,在视图中就能拿到对应project_handle为abcml、year为2021的参数值。
如果需要兼容之前的旧路径格式http://localhost:8000/api/projects/abcml/2021,可以额外保留旧路由规则,在对应视图中做重定向跳转到新的查询参数格式路径即可,避免老链接失效。
内容的提问来源于stack exchange,提问作者Hardik Patil
相关产品推荐
相关产品推荐

