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 проверьте эту документацию.