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

Posted

技术标签:

【中文标题】序列化后 Django db 字段不显示修改后的 slug 字段值【英文标题】:Django db field not displaying modified slug field value after serializing 【发布时间】:2021-09-23 02:15:16 【问题描述】:

我正在尝试在 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 ?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢你。这在我调用内置 API 时有效。当我点击此网址(内置 API):0.0.0.0:8004/blog/api/comment 时,下面是按预期显示的 created_by 字段数据。 "id": 19, "content": "comment content", "created_at": "2021-07-14T03:13:31.284656Z", "likes": 0, "thread_id": 20, "created_by": "abc@gmail.com" 当我点击我编写的自定义 API 的 url(0.0.0.0:8004/blog/api/comment/19/list_comments) 时,如下所示: action(detail=True, methods=["GET"]) def list_comments(self, request, pk): comments = Comment.objects.filter( thread_id = pk ) for comment in comments: print(comment.created_by) data = json.loads(serialize('json', comments)) print(data) return Response(data, status.HTTP_200_OK) created_by 字段仍然带有 id:“created_by”:5跨度> 您没有在自定义操作中使用您的序列化程序,请尝试:'serializer = CommentSerializer(cmets, many=True) return Response(serializer.data)' 谢谢。这行得通。过滤后的数据适当地显示 created_by 字段。但是要发送到前端,我正在使用以下方法转换为 json: data = json.loads(serialize('json', cmets)) 这再次取回 created_by 字段中的 id 您获得 id 是因为您直接从数据库序列化数据,而不是使用序列化程序。如果您不想使用序列化程序,请将您的查询集转换为 dict 并遍历它更改 dict 中的值,然后进行序列化。序列化器正是为此目的而制作的,请使用上面评论中的序列化器。

以上是关于序列化后 Django db 字段不显示修改后的 slug 字段值的主要内容,如果未能解决你的问题,请参考以下文章

DB2中截取字段以及排序问题

django的序列化

更新错误后的 DB2 触发器

Django 序列化数据之多表数据序列化

django admin外键字段选择后如何关联显示另一个字段?

即使在创建帖子期间使用 Postman 将文件上传到该字段后,Django Rest Framework 仍显示字段错误