You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:39:03