Django - Объединение моделей и получение только поля `url` атрибута ImageField одной из объединенных моделей
У меня есть класс User
, который имеет атрибут ImageField
, хранящий аватар/картинку профиля пользователя. Я пытаюсь аннотировать набор запросов Post
так, чтобы только url аватара пользователя возвращался вместе с постом, без других данных. Я пробовал 2 разных способа аннотировать запрос, но получаю ошибки, как вы можете видеть ниже, когда я пингую представления для получения постов. Как мне прикрепить url аватара пользователя к возвращаемому аннотированному Post
набору запросов?
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)
@property
def avatar_url(self):
return self.avatar.url
class Post(models.Model):
uuid = models.UUIDField(primary_key=True, default=generate_ulid_as_uuid, editable=False)
created = models.DateTimeField('Created at', auto_now_add=True)
updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
creator = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="post_creator")
body = models.CharField(max_length=POST_MAX_LEN, validators=[MinLengthValidator(POST_MIN_LEN)])
annotator.py
def query_to_full_post_data_serializer(post_query_set: QuerySet):
query_set_annotated = post_query_set.annotate(
creator_username=F('creator__username'),
creator_avatar_url=F('creator__avatar_url')
)
return FullPostDataSerializer(query_set_annotated, many=True)
annotator_version_2.py
def query_to_full_post_data_serializer(post_query_set: QuerySet):
query_set_annotated = post_query_set.annotate(
creator_username=F('creator__username'),
creator_avatar_url=F('creator__avatar__url')
)
return FullPostDataSerializer(query_set_annotated, many=True)
annotator.py
дает ошибку:
django.core.exceptions.FieldError: Cannot resolve keyword 'avatar_url' into field. Choices are: avatar, cheer_post, cheer_reply, created, creator_username, followee_id, follower_id, friendship_creator, friendshiprequest, goal_creator, goal_follow, goal_join, post_creator, reply, updated_at, userinterests, username, uuid
annotator_version_2.py
дает ошибку:
django.core.exceptions.FieldError: Cannot resolve keyword 'url' into field. Join on 'avatar' not permitted.
Вы должны использовать это вместо этого.
def query_to_full_post_data_serializer(post_query_set: QuerySet):
query_set_annotated = post_query_set.annotate(
creator_username=F('creator__username'),
creator_avatar_url=F('creator__avatar')
)
return FullPostDataSerializer(query_set_annotated, many=True)