在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
相关产品推荐
相关产品推荐

