Permissions Django Rest

Создал проект Blog с моделями Post и Category Post Создавать - могут только авторизированный пользователь, Редактировать - только автор, Смотреть - все

Category Редактировать и создавать - только Admin Смотреть - все

class PostViewSet(ModelViewSet): queryset = Post.objects.filter(is_active=True) serializer_class = PostSerializer

def get_permissions(self):
    if self.action == 'list':
        permission_classes = (AllowAny,)
    else:
        permission_classes = (IsOwnerOrReadOnly,)
    return [permission() for permission in permission_classes]

class CategoryViewSet(ModelViewSet): queryset = Category.objects.filter(is_active=True) serializer_class = CategorySerializer

def get_permissions(self):
    if self.action in ('list', 'retrieve'):
        permission_classes = (AllowAny,)
    else:
        permission_classes = (IsAdminUser, )
    return [permission() for permission in permission_classes]

Пермишены желательно писать в отдельном файле "permissions.py". Для Post думаю подойдет:

from rest_framework.permissions import SAFE_METHODS, BasePermission


class IsAuthorOrIsAdminOrReadOnly(BasePermission):
    """Пермишен пускает только Автора или Администратора. Для остальных доступ
    только на чтение.
    """

    def has_permission(self, request, view):
        return bool(
            request.method in SAFE_METHODS
            or request.user.is_authenticated
        )

    def has_object_permission(self, request, view, obj):
        return bool(
            request.method in SAFE_METHODS
            or obj.author == request.user
            or request.user.is_staff  # Если админ не может создавать, закомментируй
        )

Для Category:

class IsAdminOrReadOnly(BasePermission):
    def has_permission(self, request, view):
        return (
            request.method in SAFE_METHODS
            or request.user.is_superuser
        )

Что-то подобное.

Вернуться на верх