Django - Как аннотировать один объект Django

В Django есть замечательная возможность аннотировать набор запросов, то есть добавить атрибуты к каждому объекту в наборе запросов. Например, если у меня есть набор запросов пользователей, я могу аннотировать его числом последователей, которое является другой таблицей с внешней ключевой ссылкой на пользователя. Это можно сделать с помощью функции QuerySet.annotate(). Мне интересно, возможно ли это для одного объекта Django. У меня есть функция представления, которая получает информацию о пользователе, которая, учитывая уникальный UUID пользователя, возвращает информацию о пользователе в таблице user, а также количество последователей и подписчиков. 1 способ сделать это - просто запросить все таблицы последователей и подписчиков для uuid и создать словарь, который будет возвращен. Или создать сериализатор со всеми полями, а затем аннотировать единый объект Django, как это можно сделать с набором запросов. Возможно ли это сделать?

views.py

@api_view(['GET'])
def get_user_info(request, user_uuid):
    is_current_user = user_uuid == str(request.user.uuid)

    # Return all user info including # of followers and followees

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)

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')
@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)

Возможно, есть решение? Но is_following не возвращает правильные значения в моих тестах.

Вернуться на верх