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] к вашему представлению.

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