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

在Django REST API中是否需要使用Marking extra actions for routing?

方案选择建议

这种场景优先使用DRF的额外动作标记方案,比单独新建Viewset更合理,原因如下:

  • 逻辑内聚性更强:user_action本质是针对单个用户资源的操作,和用户详情查询同属用户资源的操作范畴,放在同一个UserViewSet中维护,后续调整逻辑、配置权限、修改校验规则都不用跨多个Viewset查找,代码结构更清晰。
  • 减少冗余代码:无需单独编写新Viewset的基础查询逻辑、权限校验逻辑、用户实例获取逻辑,仅需要用@action装饰器,指定detail=True、methods=['post'],DRF会自动完成<user_id>参数解析、对应用户实例的获取,你只需要编写核心操作逻辑即可。
  • 路由配置更省心:只要你用DefaultRouter或者SimpleRouter注册了UserViewSet,DRF会自动生成/users/<user_id>/user_action/路由,不需要手动在urls.py中单独绑定路径,降低路由配置出错的概率。

如果user_action对应的逻辑非常复杂,涉及大量子操作,后续还会扩展多个相关子路由,完全可以独立为单独资源时,再考虑单独拆分Viewset即可。

参考代码示例
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    @action(detail=True, methods=['post'])
    def user_action(self, request, pk=None):
        # 自动获取对应user_id的用户实例
        current_user = self.get_object()
        # 此处编写你的自定义操作逻辑
        return Response({'status': '操作完成'})

内容的提问来源于stack exchange,提问作者Dahn Ng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:54:01