Django REST Framework - 同一视图中每个方法的不同权限

And*_*rew 3 django django-rest-framework

所以我在这里看到了一些类似的问题,但不是我想要的。

我试图在同一视图中为每个方法设置不同的权限。我目前拥有的:

class MyViewSet(viewsets.ViewSet):
    # User must be authenticated
    permission_classes = (IsAuthenticated,)

    def list(self, request):
        ...

    # User must be admin
    def create(self, request):
        ...

    def retrieve(self, request):
        ...
Run Code Online (Sandbox Code Playgroud)

基本上,我试图确保只有管理员才能调用该create方法。我看过创建自定义权限,但这适用于整个视图集,这不是我想要的。

ils*_*005 6

我认为没有内置的解决方案。但是您可以通过覆盖该get_permissions方法来实现这一点。

class MyViewSet(viewsets.ViewSet):

    permission_classes_by_action = {
        "default": [IsAuthenticated],
        "retrieve": [AllowAny],
    }

    def get_permissions(self):
        try:
            # return permission_classes depending on `action`
            return [
                permission()
                for permission in self.permission_classes_by_action[self.action]
            ]
        except KeyError:
            # action is not set return default permission_classes
            return [
                permission()
                for permission in self.permission_classes_by_action["default"]
            ]
Run Code Online (Sandbox Code Playgroud)