Serializer.is_valid django rest framework при создании подписки
В моем проекте foodgram необходимо сделать возможность подписыватьcя на пользователей. Проверяю через postman. При отправке запроса на подписку http://127.0.0.1:8000/api/users/1/subscribe/ мне выдает ошибку:
Not Found: /api/users/1/subscribe/
[17/Nov/2022 12:03:27] "POST /api/users/1/subscribe/ HTTP/1.1" 404 23
В postman:
{
"detail": "Not found."
}
В тоже время подписка создается, ее видно при просмотре всех подписок. Также подписка успешно удаляется.
После проверки, видно, что не проходит после валидации serializer.is_valid(raise_exception=True).
Также не доходит то функции def validate в сериализаторе FollowCreateSerializer.
Помогите, если у кого есть хоть какието мысли.
Python 3.7.9 Django 3.2.16 djangorestframework 3.12.4
View создания подписки
class CustomUserViewSet(UserViewSet):
""" Вьюсет для пользователя с подписками
через POST&GET. """
queryset = CustomUser.objects.all()
serializer_class = CustomUserSerializer
permission_classes = (IsAuthenticated,)
pagination_class = LimitPageNumberPagination
@action(detail=True, methods=['POST'], url_path='subscribe')
def user_subscribe_add(self, request, id):
user = request.user
# print(user)
following = CustomUser.objects.filter(pk=id)
# print(following)
# following = get_object_or_404(CustomUser, pk=id)
serializer = FollowCreateSerializer(
data={'user': user.id, 'following': id},
context={'request': request})
print('test')
serializer.is_valid(raise_exception=True)
print('test')
serializer.save()
follow = get_object_or_404(Follow, user=user, following=following)
serializer = FollowSerializer(follow.following,
context={'request': request})
return Response(serializer.data, status=status.HTTP_201_CREATED)
Follow Serializer:
class FollowSerializer(serializers.ModelSerializer):
""" Создаем сериализатор для подписок. """
email = serializers.ReadOnlyField(source='following.email')
id = serializers.ReadOnlyField(source='following.id')
username = serializers.ReadOnlyField(source='following.email')
first_name = serializers.ReadOnlyField(source='following.first_name')
last_name = serializers.ReadOnlyField(source='following.last_name')
is_subscribed = serializers.SerializerMethodField(default=True)
recipes = serializers.SerializerMethodField()
recipes_count = serializers.SerializerMethodField()
class Meta:
fields = ('email', 'id', 'username', 'first_name', 'last_name',
'is_subscribed', 'recipes', 'recipes_count')
model = CustomUser
def get_is_subscribed(self, obj):
return Follow.objects.filter(
user=obj.user, following=obj.following).exists()
def get_recipes(self, obj):
request = self.context['request']
limit = request.GET.get('recipes_limit')
queryset = Recipe.objects.filter(author=obj.following)
if limit:
queryset = queryset[:int(limit)]
return RecipeFollowSerializer(queryset, many=True).data
def get_recipes_count(self, obj):
return Recipe.objects.filter(author=obj.following).count()
FollowCreateSerializer
class FollowCreateSerializer(serializers.ModelSerializer):
""" Сериализатор создания объекта Подписки. """
user = serializers.PrimaryKeyRelatedField(
queryset=CustomUser.objects.all())
following = serializers.PrimaryKeyRelatedField(
queryset=CustomUser.objects.all())
class Meta:
fields = '__all__'
model = Follow
validators = [
UniqueTogetherValidator(
queryset=Follow.objects.all(),
fields=['user', 'following'],
message='Подписка выполнена.'
)
]
def validate(self, data):
user = data['user']
current_follow = data['following']
if user == current_follow:
raise serializers.ValidationError(
['Подписка на себя невозможна'])
return data
При первоначальной подписке ошибка "Not found" происходит из-за того, что в строке following = CustomUser.objects.filter(pk=id) вместо одного пользователя я получал список пользователей (из одной записи) и потом этот список использовал в строке follow = get_object_or_404(Follow, user=user, following=following) из-за чего и вернулась 404 ошибка.