首页 > 解决方案 > Django 得到一个父母列表,每个父母都有自己的孩子

问题描述

我有一对父/子关系模型,例如:

class Post(models.Model):
    title = models.TextField(null=True)
    content = models.TextField(null=True)
    author = models.TextField(null=True)
    created_time = models.DateTimeField(null=True)


class Comment(models.Model):
    content = models.TextField(null=True)
    created_time = models.DateTimeField(null=True)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

序列化器就像:

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'


class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = '__all__'

最后意见:

class PostView(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer


class CommentView(viewsets.ModelViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer

现在我想创建一个返回Posts 列表的 API,其中每个Post将包含两个附加字段,一个是all_comments,另一个是latest_comment。我知道这可以使用JOINs 在 SQL 中轻松完成。我是 Django 的新手。我想知道在 Django 中是否有任何简单的方法可以做到这一点。谢谢。

标签: pythondjangodjango-rest-framework

解决方案


希望这个配置对你有用:)

class CommentPostSerializer(serializers.ModelSerializer): # New Serializer class
    class Meta:
        model = Comment
        exclude = ('post',)


class PostSerializer(serializers.ModelSerializer):
    all_comments = CommentPostSerializer(read_only=True, many=True, source='comment_set')
    latest_comment = serializers.SerializerMethodField()

    def get_latest_comment(self, post):
        latest_comment = post.comment_set.last()
        return CommentPostSerializer(latest_comment).data

    class Meta:
        model = Post
        fields = '__all__'

推荐阅读