"list"、"create"、"retrieve"、"update" 的 ModelViewset 方法中的每个方法使用装饰器的不同权限

Different Permissions using decorators for each methods inside ModelViewset methods for "list", "create" , "retrieve", "update"

我想使用装饰器为 ModelViewset class 的不同方法添加不同的权限。

我试过了:

class abcd(viewsets.ModelViewSet):

    @permission_classes(IsAuthenticated,))
    def list(self, request, format=None):
        try:


    @permission_classes(CustomPermission,))
    def create(self, request, format=None):
        try:

但它不起作用。 我也尝试使用 @method_decorator。那也没用。

我知道我们可以通过以下方式进行:

def get_permissions(self):
    if self.action == 'create':
        return [IsAuthenticated(), ]        
    return super(abcd, self).get_permissions()

但我想知道我们是否可以使用 Django Rest Framework 的装饰器来实现这一点。

ModelViewSet继承了Mixin类和GenericAPIViewlistcreate 方法来自 Mixins,因此用 permission_classes 装饰是行不通的。相反,您可以尝试覆盖 APIView.

中的 get_permissions
def get_permissions(self):
    if self.request.method == "GET":
        return [IsAuthenticated()]
    elif self.request.method == "POST":
        return [CustomPermission()]
    return [permission() for permission in self.permission_classes]

注意:我不确定上面的代码是否有效

官方页面显示了示例代码。
所以最好不要使用 self.request.method 但 self.aciton 属性.

def get_permissions(self):
    """
    Instantiates and returns the list of permissions that this view requires.
    """
    if self.action == 'list':
        permission_classes = [IsAuthenticated]
    else:
        permission_classes = [IsAdmin]
    return [permission() for permission in permission_classes]

https://www.django-rest-framework.org/api-guide/viewsets/#introspecting-viewset-actions