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
не возвращает правильные значения в моих тестах.