вы должны использовать сериализатор для User
, а не following
:
class UserSerializer(serializers.ModelSerializer):
is_following = serializer.IntegerField()
class Meta:
model = User
fields = ('username', 'email', 'is_following')
, также измените ваш набор запросов, как показано ниже:
from django.db import models
from rest_framework.generics import get_object_or_404
class FollowingAPIView(ListAPIView):
serializer_class = FollowingSerializer
### so add this method to get the requested user based on the username in the url
def get_requested_user(self):
##get the user based on the user name in url
filter_kwargs = {'username': self.kwargs['username']}
obj = get_object_or_404(User.objects.all(), **filter_kwargs)
return obj
def get_queryset(self):
requested_user = self.get_requested_user()
return User.objects.filter(targets__target=requested_user)\
.annotate(is_following=models.Count('followers', filter=models.Q(followers__follower=requested_user), distinct=True))
, если вы используетеDjango <2.0, ваш <code>get_queryset должен выглядеть следующим образом:
def get_queryset(self):
requested_user = self.get_requested_user()
return User.objects.filter(targets__target=requested_user)\
.annotate(is_following=models.Count(models.Case(models.When(models.Q(followers__follower=requested_user), 1))))
, потому что вы хотите вернуть список пользователей, а не следующих экземпляров.используйте только следующее, чтобы отфильтровать (targets__
в фильтре выше) пользователей, что их target
в Following
является текущим аутентифицированным пользователем (по крайней мере, в одной из его целей).
обновлено
также измените ваш URL-адрес на что-то вроде этого:
path('/api/followers/<username>/', FollowingAPIView.as_view(), name='get_user_followers')