Ошибка при выводе подписок пользователя в Django Rest Framework "detail": "Not found."
В моем проекте foodgram необходимо сделать возможность подписыватья на пользователей.
Проверяю через postman.
При переходе на http://127.0.0.1:8000/api/users/subscriptions/ мне выдает ошибку "detail": "Not found."
В консоли пишет:
Not Found:
/api/users/subscriptions/ [11/Nov/2022 15:20:39] "GET /api/users/subscriptions/ HTTP/1.1" 404 23
Как будто, проблема в urls, но я не могу понять.
Отладчик даже не доходит до def user_subscriptions.
Буду рад любой помощи.
Python 3.7.9
Django 3.2.16
djangorestframework 3.12.4
api/urls.py
router_v1 = DefaultRouter()
router_v1.register('recipes', RecipesViewSet, basename='recipes')
router_v1.register('tags', TagsViewSet, basename='tags')
router_v1.register('ingredients', IngredientsViewSet, basename='ingredients')
router_v1.register('users', CustomUserViewSet, basename='users')
urlpatterns = [
path('auth/', include('djoser.urls.authtoken')),
path('', include('djoser.urls')),
path('', include(router_v1.urls)),
]
foodgram/urls.py
urlpatterns = [
path('api/', include('api.urls')),
path('admin/', admin.site.urls),
]
recipes/views.py
class CustomUserViewSet(UserViewSet):
""" Виевсет пользователя для подписок. """
queryset = User.objects.all()
serializer_class = CustomUserSerializer
permission_classes = (permissions.IsAuthenticated,)
pagination_class = LimitPageNumberPagination
@action(detail=True, methods=['POST'], url_path='subscribe')
def user_subscribe_add(self, request, id):
user = request.user
following = get_object_or_404(User, pk=id)
serializer = FollowSerializer(
data={'user': user.id, 'following': id},
context={'request': request})
serializer.is_valid(raise_exception=True)
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)
@user_subscribe_add.mapping.delete
def user_subscribe_del(self, request, id):
user = request.user
following = get_object_or_404(User, pk=id)
if not Follow.objects.filter(user=user,
following=following).exists():
return Response(['Вы не подписаны на этого пользователя'],
status=status.HTTP_400_BAD_REQUEST)
follow = Follow.objects.get(user=user, following=following)
follow.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
@action(methods=['get'], detail=False, url_path='subscriptions',
permission_classes=[permissions.IsAuthenticated])
def user_subscriptions(self, request):
user = request.user
queryset = Follow.objects.filter(user=user)
pages = self.paginate_queryset(queryset)
serializer = FollowSerializer(
pages,
many=True,
context={'request': request}
)
return self.get_paginated_response(serializer.data)
api/serializers.py
class FollowSerializer(serializers.ModelSerializer):
""" Cериализатор подписок. """
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()
recipes = serializers.SerializerMethodField()
recipes_count = serializers.SerializerMethodField()
class Meta:
fields = ('email', 'id', 'username', 'first_name', 'last_name',
'is_subscribed', 'recipes', 'recipes_count')
model = Follow
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 = Recipes.objects.filter(author=obj.following)
if limit:
queryset = queryset[:int(limit)]
return RecipeFollowSerializer(queryset, many=True).data
def get_recipes_count(self, obj):
return Recipes.objects.filter(author=obj.following).count()
recipes/models.py
class Follow(models.Model):
""" Модель подписки. """
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='follower',
)
following = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='following',
)
class Meta:
verbose_name = 'Подписка'
verbose_name_plural = 'Подписки'
constraints = [
models.UniqueConstraint(
fields=['user', 'following'],
name='unique_following')]