繁体   English   中英

Django Rest API。 在单个 API 调用中获取来自不同模型的所有数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM