Джанго получает список родителей, каждый из которых имеет своих детей - PullRequest
3 голосов
/ 23 мая 2019

У меня есть пара моделей отношений родитель / потомок, таких как:

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

Теперь я хочу создать API, который возвращает список Post с, в котором каждое Post будет содержать два дополнительных поля, одно из которых будет all_comments, а другое - latest_comment.Я понимаю, что это может быть легко сделано в SQL, используя JOIN s.Я новичок в Джанго.Интересно, есть ли простой способ сделать это в Джанго?Спасибо.

1 Ответ

4 голосов
/ 23 мая 2019

Надеюсь, этот конфиг работает на вас:)

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


class PostSerializer(serializers.ModelSerializer):
    <b>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</b>

    class Meta:
        model = Post
        fields = '__all__'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...