Django db 字段在序列化后不显示修改后的 slug 字段值

问题描述

我正在尝试在 Comment 类的 created_by 字段中获取用户名而不是用户 ID。我的模型如下:

class Comment(models.Model):
    thread_id = models.ForeignKey(Thread,on_delete=models.CASCADE)
    content = models.TextField()
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_Now_add=True)
    likes = models.IntegerField(default=0)

在序列化程序中使用了 slugfield。

class CommentSerializer(serializers.ModelSerializer):
    created_by = serializers.SlugrelatedField( 
                        slug_field='email',queryset=User.objects.all())
    class Meta:
        model = Comment
        fields = ("id","thread_id","content","created_by","created_at","likes")

在下面的 api 中,字段 created_by 仍然具有用户 ID 而不是电子邮件

 @action(detail=True,methods=["GET"])
    def list_comments(self,request,pk):
        comments = Comment.objects.filter(
            thread_id = pk
        )
        data = json.loads(serialize('json',comments))
        print("**************data**************")
        print(data)
        return Response(data,status.HTTP_200_OK)

打印出来的数据是这样的:

[{'model': 'blog.comment','pk': 20,'fields': {'thread_id': 19,'content': 'hi','created_by': 2,'created_at': '2021-07-14T03:34:11.333Z','likes': 0}}]

这是因为序列化吗?如何正确获取 created_by 的值作为用户电子邮件而不是 id ?

解决方法

在序列化器上使用 to_representation() 方法

def to_representation(self,instance):
    rep = super(CommentSerializer,self).to_representation(instance)
    rep['created_by'] = instance.created_by.email
    return rep