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

ljsrvy3e  于 2022-12-05  发布在  Go
关注(0)|答案(1)|浏览(153)

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”的额外属性。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
disho6za

disho6za1#

可以将源参数传递给序列化程序字段,以访问相关模型中的属性

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

相关问题