为什么我不能在 Django Rest Framework 中的 ModelViewSet 上使用 @action 装饰器

tim*_*tim 2 python django decorator django-rest-framework

我在模型上构建了一个非常基本的ViewSetUser来 CRUD 用户。

  • 我想使用ModelViewSet装饰@action器来使代码干净。
  • IsAuthenticated设置该功能所需的权限(仅作为示例) list。这样只有签署的人才能执行此操作。

这是代码示例。

from rest_framework.decorators import action, list_route
from rest_framework.permissions import IsAuthenticated

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    @action(detail=False, permission_classes=[IsAuthenticated])
    def list(self, request, *args, **kwargs):
        return super(UserViewSet, self).list(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

但我得到了一个错误

无法在以下方法上使用 @action 装饰器,因为它们是现有路由:list

如果我删除@action,效果很好。我的问题是为什么我不能在现有路线上使用 @action 装饰器list

imp*_*ren 9

@action用于“额外操作”,实际上意味着(如果您检查代码):“路由器中未明确定义”。DefaultRouter因此,如果您使用或在 url 中注册视图SimpleRouter,则路由器将抛出此错误。

对于您的情况,您可以按照文档示例View.get_permissions中所示进行修改:

from rest_framework.permissions import IsAuthenticated

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

    def get_permissions(self):
        if self.action == 'list':
            return [IsAuthenticated()]
        else:
            return super(self, UserViewSet).get_permissions()
Run Code Online (Sandbox Code Playgroud)