首页 > 解决方案 > 为什么我不能在 Django Rest Framework 中的 ModelViewSet 上使用 @action 装饰器

问题描述

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

这是代码示例。

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)

但我有一个错误

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

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

标签: pythondjangodjango-rest-frameworkdecorator

解决方案


@action用于“额外操作”,实际上意味着(如果您检查代码):“未在路由器中明确定义”。因此,如果您使用DefaultRouteror在 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()

推荐阅读