Permissions Django Rest

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

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]

Ответы (1 шт):

Автор решения: Денис Шахбазян

Пермишены желательно писать в отдельном файле "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
        )

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

→ Ссылка