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)