@dert2313

Как выполнить данную проверку в сериализаторе?

Сама суть вопроса: я сделал проверку того, что пользователь не может подписаться на одного автора 2 раза в сериализаторе. Но для вызова is_valid() во вьюхе в сериализатор нужно передать параметр data. И я не совсем понимаю, что туда нужно передать для вызова is_valid() ----> для ошибки сериализатора в случае попытки подписаться 2 раз.

Сериализатор:
class UserFollowSerializer(serializers.ModelSerializer):
    is_subscribed = serializers.SerializerMethodField()
    recipes = UserRecipeSerializer(many=True, read_only=True)
    recipes_count = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = (
            'email',
            'id',
            'username',
            'first_name',
            'last_name',
            'is_subscribed',
            'recipes',
            'recipes_count'
        )

    def get_is_subscribed(self, obj):
        user = self.context.get('user')
        return user.follower.filter(author=obj).exists()

    def get_recipes_count(self, obj):
        return obj.recipes.count()

    def validate(self, data):
        author = get_object_or_404(User, self.context.get['pk'])
        if Follow.objects.filter(
            user=self.context['request'].user,
            author=author
        ).exists():
            raise serializers.ValidationError(
                'Вы уже подписаны на этого автора'
            )
        return data


Вьюшка:
@action(
        detail=True,
        methods=('post', 'delete'),
        permission_classes=(IsAuthenticated,),
    )
    def subscribe(self, request, pk):
        author = get_object_or_404(User, pk=pk)
        if request.method == 'POST':
            if author == request.user:
                return Response(
                    {'errors': 'Вы пытаетесь подписаться на себя'},
                    status=status.HTTP_400_BAD_REQUEST,
                )
            serializer = UserFollowSerializer(
                author,
                # data=?
                context={
                    'request': request,
                }
            )
            serializer.is_valid(raise_exception=True)
            Follow.objects.create(user=request.user, author=author)
            return Response(
                serializer.data,
                status=status.HTTP_201_CREATED
                )
        Follow.objects.filter(user=request.user, author=author).delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
  • Вопрос задан
  • 1093 просмотра
Пригласить эксперта
Ответы на вопрос 1
kgb_zor
@kgb_zor
I need your traceback.
0. Идите читать документацию
1. is_valid() не используют вкупе с переданным экземпляром класса
2. Реализовывать такую логику некорректно, напишите @classmethod для Follow, в котором вы будете проверять ваше условие
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы