[英]Django Rest API. Get all data from different models in a single API call
我正在尝试使用一个 API 调用来获取与 model Post 相关的所有数据。 此电话应包括发布内容、评论、赞成和反对票。
我有 4 个模型,邮政 model 是所有其他 model 的外键。
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)
这是返回的 output
[
{
"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 用于related_name
。 如果要保留序列化程序字段名称,可以将其用作source
字段
所以例如
upvote = UpVoteSerializer(read_only=True, source='upvote_post')
同样,拥有OneToOne
关系以保持投票计数也没有多大意义,因为您可以直接在 model 帖子中投票
在这里,您已经在另一个模型中定义了 Upvote、DownVote 和 Comment,并且您为每个外键或 OneToOne 字段赋予了相关名称,因此,将该相关名称与带有源的序列化程序一起使用,您可以访问相关 object 的数据。
upvote = UpVoteSerializer(read_only=True, source='upvote_post')
downvote = DownVoteSerializer(read_only=True, source='downvote_post')
comments = CommentSerializer(read_only=True, source='comment_post')
在这里,制作另一个 model 来记录赞成票和反对票并不是最佳做法。 您可以轻松地将它们放在后期模型中。
class allModelSerializer(serializers.Serializers):
filed1_from_model1 = serializers.CharField(max_length=10)
.....
.....
# number of fields u wants from different models
在视图文件中只需调用
class viewsOne():
def get():
model1_data = model1_call
model2_data = model2_call
....
....
all_model = [model1_data,model2_data,......]
# pass a response
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.