序列化后 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 字段值的主要内容,如果未能解决你的问题,请参考以下文章
django admin外键字段选择后如何关联显示另一个字段?
即使在创建帖子期间使用 Postman 将文件上传到该字段后,Django Rest Framework 仍显示字段错误