Django传递字符串参数不生效,Postman请求接口返回404如何解决?
问题根因
你返回404的核心原因是urls.py中定义的路由正则规则和你传入的分类参数格式不匹配:
你当前路由正则为r'photoByCategory/(?:(?P<category>\d+)/)?$',其中\d+规则仅支持匹配数字类型的参数,但你请求时传入的是字符串类型的nature,正则无法匹配该路径,因此直接返回404。
修复方案
场景1:需要传入分类名称字符串调用接口
按照以下两步修改代码:
- 修改urls.py的正则规则
将匹配数字的\d+替换为匹配字符串的规则:
# 分类仅包含字母、数字、下划线时使用 re_path(r'photoByCategory/(?:(?P<category>\w+)/)?$', views.photo_by_categorie, name='photo_by_categorie'), # 分类包含特殊字符(如横杠、中文等)时使用,匹配所有非斜杠字符 re_path(r'photoByCategory/(?:(?P<category>[^/]+)/)?$', views.photo_by_categorie, name='photo_by_categorie'),
- 优化视图参数逻辑(可选,避免潜在判断异常)
将视图的category默认值从布尔值False修改为None,同时补充无参数时的返回逻辑,避免请求无响应报错:
@api_view(['GET']) @permission_classes((permissions.IsAuthenticated,)) def photo_by_categorie(request, category=None): if request.method == 'GET': if category: photo_by_cat = Photo.objects.filter(category=category) serializer = PhotoSerializer(photo_by_cat, many=True) return Response(serializer.data, status=status.HTTP_200_OK) return Response({"msg": "请传入分类参数"}, status=status.HTTP_400_BAD_REQUEST)
修改完成后重启Django服务,再次请求localhost:8000/photoByCategory/nature/即可正常响应。
场景2:分类为外键字段,原设计传入分类ID调用接口
不需要修改路由规则,直接在Postman中传入数字类型的分类ID请求即可,例如localhost:8000/photoByCategory/1/。
提示:如果
Photo模型的category是关联分类表的外键,且你希望支持通过分类名称查询,需要调整视图的过滤逻辑为Photo.objects.filter(category__name=category),其中name为分类表中存储分类名称的字段。
内容的提问来源于stack exchange,提问作者Zaid Kallel
相关产品推荐
相关产品推荐

