Сама суть вопроса: я сделал проверку того, что пользователь не может подписаться на одного автора 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)