Search code examples
djangodjango-viewsdjango-rest-frameworkhttp-method

Custom permissions on viewset


Im trying to find a way to create custom permissions on a viewset. Im want to implement somthing like this :

class ActivityViewSet(viewsets.ModelViewSet):
    queryset = Activity.objects.all()
    serializer_class = ActivitySerializer
    if request.method == 'PUT':
        permission_classes = (permissions.IsOwner)
    elif request.method == 'LIST':
        permission_classes = (permissions.IsAdmin)
    else :
        permission_classes = (permissions.AllowAny)

IE : sorting permissions by method. (the above code doesnt work cause "request" isnt recognized)

Couldn't find any use in the "Custom permissions" section of the documentation, but maybe Im just blind. (overriding BasePermission? how? who? where?)

Thanks :)


Solution

  • Viewsets use action to determine HTTP a verb and permissions invoked from get_permissions method, so you can override it:

    class ActivityViewSet(viewsets.ModelViewSet):
        queryset = Activity.objects.all()
        serializer_class = ActivitySerializer
    
        def get_permissions(self):
            if self.action == 'update':
                return IsOwner()
            elif self.action == 'list':
                return IsAdminUser()
            else :
                return AllowAny()