Django rest framework - Ограничение доступа к запросу get только авторизованным пользователем
Вы можете видеть, что в этом сериализаторе я проверяю соответствие аутентифицированного пользователя пользователю экземпляра:
class CreateSupplierSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=200)
email = serializers.EmailField(max_length=200)
phone = serializers.IntegerField()
def update(self, instance, validated_data):
if str(self.context['request'].user) != str(instance.username):
raise exceptions.PermissionDenied('You do not have permission to update')
supplier = Supplier.objects.create(user=instance, **validated_data)
return supplier
class Meta:
model=Supplier
fields=['name','email','phone']
Мне интересно, как я могу реализовать этот же метод в моем запросе get, вот формат моего запроса get...
models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
bio = models.CharField(max_length=200)
email = models.CharField(max_length=200)
class Supplier(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=200)
phone = models.IntegerField()
email = models.EmailField(max_length=200)
views.py:
class getsuppliers(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = GetSuppliersSerializer
lookup_field = 'username'
serializers.py:
class SuppliersSerializer(serializers.ModelSerializer):
class Meta:
model = Supplier
fields = ['pk','user','name','email','phone']
class GetSuppliersSerializer(serializers.ModelSerializer):
supplier_set = SuppliersSerializer(read_only=True, many=True)
class Meta:
model = User
fields = ['supplier_set']
Вы можете переопределить метод retrieve
из viewsets.ModelViewSet
, чтобы добиться аналогичного поведения. Позже вызовите метод по умолчанию retrieve
.
class getsuppliers(viewsets.ModelViewSet):
queryset = Supplier.objects.all()
serializer_class = GetSuppliersSerializer
lookup_field = 'username'
def retrieve(self, request, *args, **kwargs):
if self.request.user != self.get_object().username:
raise exceptions.PermissionDenied('You do not have permission to update')
super().retrieve(request, *args, **kwargs)
Большое спасибо @Uzzal H. Mohammad за указание на функцию retrieve... вот рабочее решение
class getsuppliers(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = GetSuppliersSerializer
lookup_field = 'username'
def retrieve(self, request, *args, **kwargs):
if str(self.request.user) != self.get_object().username:
raise exceptions.PermissionDenied('You do not have permission to update')
instance = self.get_object()
return Response(self.serializer_class(instance).data)
Я думаю, что лучшим, многократно используемым решением будет использование разрешений, которые созданы для таких случаев использования.
Создайте разрешение для описания того, что вы хотите сделать
class IsOwner(BasePermission):
def has_object_permission(self, request, view, obj):
return request.user == obj.user
Затем добавьте permission_classes = [IsOwner]
к вашему представлению.