python - 为什么我不能在 Django Rest Framework 中的 ModelViewSet 上使用 @action 装饰器
问题描述
我在模型上构建了一个非常基本的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)
但我有一个错误
不能在以下方法上使用 @action 装饰器,因为它们是现有路由:列表
如果我删除@action
,它工作得很好。我的问题是为什么我不能在现有路线上使用 @action 装饰器list
?
解决方案
@action
用于“额外操作”,实际上意味着(如果您检查代码):“未在路由器中明确定义”。因此,如果您使用DefaultRouter
or在 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()
推荐阅读
- javascript - 如何覆盖 d3.js 的 linkHorizontal() 函数
- c# - 如果您有多个应用程序,将用户存储在一个表中,并使用区分应用程序的列是一种好的设计实践吗?
- angular - 在角度的 mat-toggle 上使用 ::ng-deep 时 attr 绑定不起作用
- mule - Mule 4 中的 HTTP 请求
- c# - 我通过授权码授予获得 cookie 而不是令牌
- azure - 资源所有者密码凭据令牌在 Azure Function App 上导致 401
- docker - Docker-compose 容器拒绝连接
- docker - 由于 GUEST_MOUNT_CONFLICT 退出:在启动 minikube 时
- javascript - 在 Javascript 中动态添加更多值
- azure - 在资源图资源管理器中使用 kusto 仅按类型显示特定资源