在Django中添加一个自定义的非模型属性?



新手到DRF和有一个模型叫posts。另一个叫用户。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')
...