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?
@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)