Djnago rest framework как разрешить обновлять только собственный контент пользователя

Я не хочу позволять любому пользователю обновлять объект другого пользователя. Я хочу разрешить только обновление собственного содержимого пользователя. вот мой код:

models.py

class Blog(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
    blog_title = models.CharField(max_length=200, unique=True)

views.py

class BlogViewSet(viewsets.ModelViewSet):
    queryset = Blog.objects.all()
    serializer_class = BlogSerializer
    pagination_class = BlogPagination
    lookup_field = 'blog_slug'
    

    def update(self, request, slug=None):
        pass

Вы можете использовать разрешения на уровне объекта. Создайте пользовательский класс разрешений под названием IsOwnerOrReadOnly

from rest_framework import permissions


class IsOwnerOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True

        # Write permissions are only allowed to the owner of the blog.
        return obj.author == request.user

Затем добавьте это разрешение к BlogViewSet:

class BlogViewSet(viewsets.ModelViewSet):
    queryset = Blog.objects.all()
    serializer_class = BlogSerializer
    pagination_class = BlogPagination
    lookup_field = 'blog_slug'
    permission_classes = [IsOwnerOrReadOnly]

Вы можете использовать пакет django-rest-framework-guardian. Он основан на django-quardian. Вы должны изменить ваш сериализатор следующим образом:

from rest_framework_guardian.serializers import ObjectPermissionsAssignmentMixin
class BlogSerializer(ObjectPermissionsAssignmentMixin, serializers.ModelSerializer):
  class Meta:
     model = Blog
     fields = "__all__"

  def get_permissions_map(self, created):
      current_user = self.context['request'].user
      readers = Group.objects.get(name='readers') # if you need
      supervisors = Group.objects.get(name='supervisors') # if you need

      return {
        'view_blog': [current_user, readers],
        'add_blod': [current_user],
        'change_blog': [current_user],
        'delete_blog': [current_user, supervisors]
      }

После этого необходимо добавить ObjectPermissionsFilter в настройки REST_FRAMEWORK. Это повлияет на все представления в вашем проекте:

REST_FRAMEWORK = {
   "DEFAULT_FILTER_BACKENDS": [
       "django_filters.rest_framework.DjangoFilterBackend",
       "rest_framework_guardian.filters.ObjectPermissionsFilter",
   ],
}

Эти пакеты предлагаются из Django Rest Framework проверьте эту документацию.

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