Django - Возвращает атрибут в ответ, если текущий зарегистрированный пользователь следует за запрашиваемым пользователем

У меня есть представление, которое запрашивает пользователя User по его uuid. Каждый раз, когда делается запрос, он должен сопровождаться маркером доступа, который позволяет мне узнать, кто является текущим пользователем. Ниже у меня есть конечная точка, которая возвращает всю информацию о запрашиваемом пользователе, включая количество его подписчиков или количество людей, за которыми он следует. Я хочу иметь возможность возвращать атрибут, определяющий, следует ли текущий пользователь, который извлекается из request.user, за запрашиваемым пользователем с uuid пользователя user_uuid. Я пробовал is_following=Count('followee_id', filter=Q(follower_id=str(request.user.uuid)))), но это, похоже, не возвращает правильное значение, поскольку у меня есть тесты, которые проверяют, истинно ли это значение, когда оно установлено в тестовой базе данных, и они терпят неудачу. Как мне аннотировать мой запрос, чтобы включить, следует ли текущий пользователь за пользователем с user_uuid?

view.py

@api_view(['GET'])
def get_user_info(request, user_uuid):
    query = User.objects.filter(pk=user_uuid)
    if query.exists():
        query_annotated = query.annotate(
            follower_count=Count('followee_id', distinct=True),
            followee_count=Count('follower_id', distinct=True),
            is_following=Count('followee_id', filter=Q(follower_id=str(request.user.uuid))))
    else:
        return Response(dict(error=str('User not found.'),
                             user_message='User not found.'),
                        status=status.HTTP_404_NOT_FOUND)
    serializer = FullUserSerializer(query_annotated[0])
    return Response(serializer.data, status=status.HTTP_200_OK)

serializer.py

from rest_framework import serializers

from cheers.models import User


class FullUserSerializer(serializers.ModelSerializer):
    follower_count = serializers.IntegerField()
    followee_count = serializers.IntegerField()
    is_following = serializers.BooleanField()

    class Meta:
        model = User
        fields = ('uuid', 'username', 'avatar', 'created', 'follower_count',
                  'followee_count', 'is_following')

models.py

class User(AbstractDatesModel):
    uuid = models.UUIDField(primary_key=True)
    username = models.CharField(max_length=USERNAME_MAX_LEN, unique=True, validators=[
        MinLengthValidator(USERNAME_MIN_LEN)])
    created = models.DateTimeField('Created at', auto_now_add=True)
    updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
    avatar = models.ImageField(upload_to=avatar_directory_path, blank=True, null=True)

class FollowUser(AbstractSimpleModel):
    follower = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='follower_id')
    followee = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='followee_id')

Вот мой тест, который не работает. self.assertTrue(response.data['is_following']) это то, что не работает.
test.py

class GetUserInfoTest(TestCase):
    @classmethod
    def setUpTestData(cls) -> None:
        cls.user = get_or_create_test_user_in_DB()
        cls.access_token = get_test_user_access_token()
        cls.num_followers = 5
        cls.num_followees = 3

        for i in range(cls.num_followers):
            created_user = UserFactory()
            FollowUser.objects.create(follower=created_user, followee=cls.user)

            if i == cls.num_followers - 1:
                cls.last_follower = created_user

        for i in range(cls.num_followees):
            created_user = UserFactory()
            FollowUser.objects.create(follower=cls.user, followee=created_user)

            if i == cls.num_followees - 1:
                cls.last_followee = created_user

    def test_get_last_followee(self):
        response = self.client.get(
            reverse('get_user_info',
                    kwargs={'user_uuid': str(self.last_followee.uuid)}),
            content_type='application/json',
            **{'HTTP_AUTHORIZATION': f'bearer {self.access_token}'})
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertTrue(response.data['is_following'])
        self.assertEqual(response.data['follower_count'], 1)
        self.assertEqual(response.data['followee_count'], 0)
Вернуться на верх