Django DRF搭建API无返回值、路由匹配404问题求助
DRF自定义接口404、自定义方法未调用问题解决方案
核心问题排查
你遇到的问题是三个错误叠加导致的:
- 自定义
@action装饰的方法名和DRF ViewSet的保留属性queryset重名,逻辑冲突 try-except捕获的异常类型错误,查询Post对象却捕获Analysis的不存在异常- 路由配置完全不符合DRF ViewSet +
@action的路由生成规则,请求没有指向你写的自定义方法
具体修改步骤
1. 修正views.py代码
首先重命名自定义方法,修改异常捕获逻辑:
class PostViewSet(viewsets.ModelViewSet): # 注意:ModelViewSet必须指定queryset属性,即使你自定义了查询逻辑也要加,否则会报错 queryset = Post.objects.all() serializer_class = PostSerializer # permission_classes = [IsAuthenticated] # 1. 方法名改成和你接口后缀对应的post_analysis,不能叫queryset,这是保留属性 # 2. detail=True的action会自动匹配带pk参数的路径 @action(detail=True, methods=['GET']) def post_analysis(self, request, pk=None): try: # 这里你用post_id作为主键查询,确认你的Post模型主键确实是post_id不是默认的id post_obj = Post.objects.get(post_id=pk) # 修正:查询Post对象就捕获Post的不存在异常 except Post.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) serializer = self.get_serializer(post_obj) return Response(serializer.data)
2. 修正urls.py配置(用DefaultRouter自动生成,最简便)
DefaultRouter注册的时候只需要填基础路径,detail=True的@action会自动拼接/<pk>/<方法名>/生成最终路径,不需要你手动写pk和后缀:
router = DefaultRouter() # 只填基础前缀api/post即可,basename建议和视图对应,不要叫app_name router.register(r'api/post', PostViewSet, basename='post') urlpatterns = router.urls
配置完成后你要访问的接口/api/post/698/post_analysis/就可以正常匹配了,请求会自动调用你写的post_analysis方法。
如果你坚持手动写路由的修正方案
手动映射的时候要把GET请求指向你自定义的方法名,同时路径里要保留pk参数,不能写死698:
PostView = PostViewSet.as_view({ # 这里映射到你修改后的自定义方法名post_analysis,不是默认的retrieve 'get': 'post_analysis' }) urlpatterns = format_suffix_patterns([ # 路径里要保留pk参数,才能传给视图查询 path('api/post/<int:pk>/post_analysis/', PostView, name='app_name') ])
内容的提问来源于stack exchange,提问作者schedulingqs
相关产品推荐
相关产品推荐

