Оптимизация запросов к базе данных Django ORM

Необходимо оптимизировать запросы к базе данных, т.е. сократить их количество до минимума. Сейчас на получение поста, как показывает мне django-debug-tools, идет 2 запроса, а на получение комментария зависит от вложенности, 1 уровень 2 запроса и чем выше уровень тем больше запросов, т.е. +1 на уровень. Как их уменьшить?

#models.py
from django.db import models
from mptt.fields import TreeForeignKey
from mptt.models import MPTTModel


class Post(models.Model):
    author = models.CharField(
        max_length=122,
        null=True,
        blank=True,
        default='Anonymous',
    )
    title = models.CharField(
        max_length=200,
        null=True,
        blank=True,
        default='Not title'
    )
    text = models.CharField(
        max_length=200
    )
    published = models.DateTimeField(auto_now_add=True)


class Comment(MPTTModel):
    parent = TreeForeignKey(
        'self',
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name='children')
    title = models.CharField(
        max_length=200,
        null=True,
        blank=True,
        default='Not title'
    )
    author = models.CharField(
        max_length=122,
        null=True,
        blank=True,
        default='Anonymous',
    )
    post = models.ForeignKey(
        Post,
        on_delete=models.CASCADE,
        related_name='comments'
    )
    published = models.DateTimeField(
        auto_now_add=True
    )


#serializers.py

from django.conf import settings
from mptt.templatetags.mptt_tags import cache_tree_children
from rest_framework import serializers

from post.models import Comment, Post


class CommentSerializer(serializers.ModelSerializer):
    children = serializers.SerializerMethodField('get_children')

    def get_children(self, comment):
        max_level = settings.MAX_LEVEL
        children = comment.get_children()
        if all([max_level is not None, comment.get_level() >= max_level]):
            return []
        return CommentSerializer(
            children,
            many=True
        ).data

    class Meta:
        model = Comment
        exclude = ('lft', 'rght', 'tree_id')
        read_only_fields = ('comments',)

class PostSerializer(serializers.ModelSerializer):
    comments = serializers.SerializerMethodField('get_comments')

    def get_comments(self, post):
        comments = cache_tree_children(
            Comment.objects.filter(
                post=post,
                level__lte=settings.MAX_LEVEL
            )
        )
        serializer = CommentSerializer(
            comments,
            many=True
        )
        return serializer.data

    class Meta:
        model = Post
        fields = '__all__'
        read_only_fields = ('comments',)



#views.py    
from rest_framework import viewsets

from api.serializers import CommentSerializer, PostSerializer
from post.models import Comment, Post

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

    def perform_create(self, serializer):
        serializer.save()


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


    def perform_create(self, serializer):
        serializer.save()
Вернуться на верх