Добавление пользовательского, немодельного атрибута в набор запросов в Django?
Новичок в DRF и имею модель под названием posts. И еще одна модель называется user. Объект post выглядит следующим образом:
class Post(models.Model):
"""
Post model
"""
title = models.CharField(max_length=250)
body = models.TextField()
author = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='forum_posts')
parent_post = models.ForeignKey('self',
on_delete=models.CASCADE,
blank=True,
null=True)
time_stamp = models.DateTimeField(default=timezone.now)
objects = models.Manager()
Сериализатор для этой модели следующий:
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = models.Post
fields = ('id', 'title', 'body', 'parent_post', 'author', 'time_stamp')
extra_kwargs = {'id': {'read_only': True},
'author': {'read_only': True}}
При возврате данных для этой модели я хочу добавить дополнительный атрибут к каждому объекту в наборе запроса под названием "author_username". Имя пользователя должно быть именем пользователя, принадлежащим id автора поста. Я также хочу сделать это без модификации модели, чтобы добавить еще один атрибут, такой как "author_username", поскольку это будет излишним (уже есть FK для автора). Итак, в идеале, json для объекта должен выглядеть следующим образом:
'post_id': 1
'post_title': 'Example post'
'post_body': 'Example post'
'author_id': 1
'parent_post_id': null
'time_stamp': '2022'
'author_username': 'testUser'
Как я могу это сделать?
Вот мое мнение:
class PostList(generics.ListCreateAPIView):
permission_classes = [IsAuthenticatedOrReadOnly]
queryset = models.Post.objects.all()
serializer_class = serializers.PostSerializer
Аргумент source может быть передан полю сериализатора для доступа к атрибуту из связанной модели
class PostSerializer(serializers.ModelSerializer):
author_username = serializers.CharField(source="author.username", read_only=True)
class Meta:
model = models.Post
...
Вы должны добавить вызов select_related
к кверисету вашего представления
class PostList(generics.ListCreateAPIView):
...
queryset = models.Post.objects.select_related('author')
...