Django Сериализаторы Rest Framework: Проверка object.user является request.user - PullRequest
0 голосов
/ 21 апреля 2020

Я работаю над REST API с Django Rest Framework, и в моем ModelViewSet мне нужно проверить, что текущий request.user имеет право редактировать определенный объект.

Я нашел часть документации, которая определяет, как работают разрешения - но это на стороне ViewSet, а не на стороне сериализатора:

class FooViewSet(viewsets.ModelViewSet):
    model = Foo
    serializer_class = FooSerializer

    def get_queryset(self):
        return self.request.user.foos.all()

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)

    def get_permissions(self):
        if self.action == "list":
            permission_classes = [permissions.IsAuthenticated]
        else:
            permission_classes = [IsObjectUser]
        return [permission() for permission in permission_classes]

Это будет нормально работать для 403ing, когда это не соответствующий пользователь, но я полагаю, что я должен также выполнять проверку на уровне сериализатора? Как я могу получить объект в моем методе validate для проверки?

class FooSerializer(serializers.ModelSerializer):

    class Meta:
        model = Foo
        fields = [
            "type",
            "title",
            "description",
            "image",
        ]

    def validate(self, attrs):
        # <-- how can I get the object so I can check against the self.request.user?

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Мой ответ, что вы не должны. В идеале ваши сериализаторы не знают о запросе. Это область представлений (за исключением). Кроме того, поскольку user не указано в полях FooSerializer, нет смысла проверять пользователя. Если пользователь может быть указан, то он должен быть проверен.

0 голосов
/ 22 апреля 2020
   def validate(self, attrs):
        # <-- how can I get the object so I can check against the self.request.user?
         userobj=self.context['request'].user.
         print(attrs)
         title=attrs.get("title")
         enter code here

         attrs.update({'title': title})
         attrs = super().validate(attrs)
         return attrs
...