djangodjango-rest-frameworkdjango-permissions

Django REST Framework viewset per-action permissions


Is there a best practice to assign a different permission to each action of a given APIView or ViewSet?

Let's suppose I defined some permissions classes such as 'IsAdmin', 'IsRole1', 'IsRole2', ..., and I want to grant different permissions to the single actions (e.g. a user with Role1 can create or retrieve, a user with Role2 can update, and only an Admin can delete).

How can I structure a class based view in order to assign a permission class to the 'create', 'list', 'retrieve', 'update', 'delete' actions? I'm trying to do so to have a class that can be reused for different tables that have the same permission pattern.


Solution

  • You can create a custom permission class extending DRF's BasePermission.

    You implement has_permission where you have access to the request and view objects. You can check request.user for the appropriate role and return True/False as appropriate.

    Have a look at the provided IsAuthenticatedOrReadOnly class (and others) for a good example of how easy it is.

    I hope that helps.