Вы можете создать собственный класс разрешений, я сделал это ниже.
class BaseModelPerm(permissions.DjangoModelPermissions):
def get_custom_perms(self, method, view):
app_name = view.model._meta.app_label
if hasattr(view, 'extra_perms_map'):
return [app_name+"."+perms for perms in view.extra_perms_map.get(method, [])]
else:
return []
def has_permission(self, request, view):
perms = self.get_required_permissions(request.method, view.model)
perms.extend(self.get_custom_perms(request.method, view))
return (
request.user and
(request.user.is_authenticated() or not self.authenticated_users_only) and
request.user.has_perms(perms)
)
Выше разрешения может пользователь в любом представлении, как показано ниже
class UserView(viewsets.ModelViewSet):
""" User model view for the admin user """
model = User
permission_classes = (
permissions.IsAuthenticated,
accounts_permissions.IsStaffOrVendor,
accounts_permissions.BaseModelPerm,
)
extra_perms_map = {
'GET': ["can_view_user"]
}
extra_perms_map - это разрешение, связанное с этим методом.