Оптимизация запросов к бд Django ORM
Нужно оптимизировать запросы к базе данных т.е снизить их количество до минимума. Сейчас 2 запроса на получение поста как мне показывает django-debug-tools, и на получение комментария зависит от вложенности, 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()