首页 > 解决方案 > 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"
    }
]

我不知道为什么它没有返回评论以及赞成和反对票。

标签: pythondjangodjango-rest-framework

解决方案


您确实需要使用related_name来完成关系的反转。source如果要保留序列化程序字段名称,可以将其用作字段

所以例如

upvote = UpVoteSerializer(read_only=True, source='upvote_post')

此外,保持投票计数的关系也没有多大意义,OneToOne因为您可以直接在 Post 模型中进行投票


推荐阅读