python - Django 休息 API。在单个 API 调用中获取来自不同模型的所有数据
问题描述
我正在尝试使用一个 API 调用获取与模型 Post 相关的所有数据。此电话应包括帖子内容、评论、赞成票和反对票。
我有 4 个模型,Post 模型是其他模型的外键。
class Post(models.Model):
title = models.CharField(max_length=200, null=True, blank=True)
body = models.CharField(max_length=500, null=True, blank=True)
def __str__(self):
return str(self.title)
class UpVote(models.Model):
post = models.OneToOneField(Post, related_name="upvote_post", on_delete=models.CASCADE)
upvotes = models.IntegerField(default=0)
class DownVote(models.Model):
post = models.OneToOneField(Post, related_name="downvote_post", on_delete=models.CASCADE)
downvotes = models.IntegerField(default=0)
class Comment(models.Model):
post = models.ForeignKey(Post, related_name="comment_post", on_delete=models.CASCADE)
comment = models.CharField(max_length=200, null=True, blank=True)
我在一篇文章中看到了这个解决方案,将数据与存在的外键关系结合起来。
class UpVoteSerializer(serializers.ModelSerializer):
class Meta:
model = UpVote
fields = "__all__"
class DownVoteSerializer(serializers.ModelSerializer):
class Meta:
model = DownVote
fields = "__all__"
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = "__all__"
class PostSerializer(serializers.ModelSerializer):
upvote = UpVoteSerializer(read_only=True, many=False)
downvote = DownVoteSerializer(read_only=True, many=False)
comments = CommentSerializer(read_only=True, many=True)
class Meta:
model = Post
fields = ("id", "title", "body", "upvote", "downvote", "comments")
这是来自views.py 文件
@api_view(['GET'])
def postList(request):
post = Post.objects.all().order_by('-id')
serializer = PostSerializer(post, many=True)
return Response(serializer.data)
这是返回的输出
[
{
"id": 7,
"title": "1st post",
"body": "Body of 1st post"
},
{
"id": 6,
"title": "2nd post",
"body": "Body of 2nd post"
},
{
"id": 5,
"title": "3rd post",
"body": "Body of 3rd post"
},
{
"id": 4,
"title": "4th post",
"body": "Body of 4th post"
}
]
我不知道为什么它没有返回评论以及赞成和反对票。
解决方案
您确实需要使用related_name
来完成关系的反转。source
如果要保留序列化程序字段名称,可以将其用作字段
所以例如
upvote = UpVoteSerializer(read_only=True, source='upvote_post')
此外,保持投票计数的关系也没有多大意义,OneToOne
因为您可以直接在 Post 模型中进行投票
推荐阅读
- android - Android 模拟器 27.3.9:'WHvGetCapability 失败。hr=0x00000000 whpx_cap.HypervisorPresent?0'
- java - 在 map 函数中创建辅助 RDD
- sql - Mysql 创建插入过程语句不完整
- java - Elasticsearch Translog 已关闭错误
- mysql - 组功能使用无效 1111
- r - 使用 dplyr 在填充了某些条件的数据框中创建列
- coldfusion - Coldfusion中的Url编码问题
- sapui5 - SAP UI5中的TreeTable没有子行
- android - 尝试使用 ButtonTheme 设置最小宽度时出错
- c# - C#中的系统时间到纪元