Как дать разрешение только определенным пользователям редактировать поля модели в Django rest?

Итак, я создаю блог rest_api, в котором есть модели

class Post(models.Model):
     author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
     text = models.TextField()
     approved = models.BooleanField(default=False)
     ...

class Comment(models.Model):
    reply_to = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    text = models.TextField()
    approved = models.BooleanField(default=False)

Как видите, и сообщения, и комментарии должны быть одобрены, сообщения должны быть одобрены администраторами, а комментарии должны быть одобрены владельцами сообщений. Кроме того, пользователь, который создает сообщение, имеет возможность удалять, вставлять и исправлять поля, за исключением утвержденного поля, которое может быть исправлено только суперпользователем.

То же самое и с комментариями: их может создавать кто угодно, но одобрять могут только владельцы постов и суперпользователь. Пока вот мои сериализаторы.

class CommentSerializers(ModelSerializer):
    class Meta:
        model = Comment
        fields = ['id','text', 'author']
        read_only_fields = ['author']
    
class PostSerializers(ModelSerializer):
    comments = CommentSerializers(source='comment_set', many=True, read_only=True)

    class Meta:
        model = Post
        fields = [ 'id', 'text', 'author', 'approved', 'comments',]
        read_only_fields = ['author', 'approved',]


    def create(self,validated_data):
        user =  self.context['request'].user
        instance=Post.objects.create(author=user ,**validated_data)
        return instance

А вот мои взгляды и разрешения

Просмотры:

class PostListView(ListCreateAPIView):
    permission_classes = [IsAuthenticated|ReadOnly]
    serializer_class = PostSerializers

    def perform_create(self, serializer):
        serializer.save()
    def get_queryset(self):
        return Post.objects.filter(approved=True ).order_by('-published_date')

class PostDetailView(RetrieveUpdateDestroyAPIView):
    permission_classes = [IsAuthenticated|ReadOnly]

    serializer_class = PostSerializers
    lookup_field = "id"

    def get_queryset(self):
        return Post.objects.filter(approved=True)


class CommentListView(ListCreateAPIView):
    serializer_class = CommentSerializers
    permission_classes = [IsAuthenticated|ReadOnly]

    def perform_create(self, serializer):
        post_id = self.kwargs['post_id']
        post=Post.objects.get(id = post_id)
        user =  self.request.user
        serializer.save(reply_to = post, author=user )

    def get_queryset(self):
        post_id = self.kwargs['post_id']
        return Comment.objects.filter(reply_to=post_id ,approved=True)

class CommentDetailView(RetrieveUpdateDestroyAPIView):
    permission_classes = [IsAuthenticated|ReadOnly]
    serializer_class = CommentSerializers
    lookup_field = "id"
    def get_queryset(self):
        return Comment.objects.filter(approved=True)

Разрешения:

class ReadOnly(BasePermission):
    def has_permission(self, request, view):
        return request.method in SAFE_METHODS
class IsSuperUser(BasePermission):

    def has_permission(self, request, view):
        return request.user and request.user.is_superuser

class IsOwner(BasePermission):

    def has_object_permission(self, request, view, obj):
        if request.user:
            if request.user.is_superuser:
                return True
            else:
                return obj.author == request.user
        else:
            return False

class IsOwnerOfPost(BasePermission):
    def has_object_permission(self,request, view, obj):
        if request.user:
            if request.user.is_superuser:
                return True
            else:
                return obj.post.author == request.user
        else:
            return False

person iamafasha    schedule 03.12.2020    source источник
comment
Я думаю, это может вам помочь: stackoverflow.com/questions/19128793/   -  person Sajad    schedule 04.12.2020
comment
Вы должны создать отдельную конечную точку действия в своих представлениях для комментирования и утверждения публикации. Таким образом, вы можете отделить его от основной конечной точки и получить более простые разрешения.   -  person Ken4scholars    schedule 04.12.2020
comment
Ответ, приведенный в ссылке, предоставленной @Sajad, работает для меня. Можно ли применять классы разрешений условно?   -  person iamafasha    schedule 04.12.2020