Можно ли уменьшить количество запросов к базе средствами ORM?

На каждый комментарий создается заброс к бд, а если комментарий с фото, то 2 запроса. Комментарии имеют 2 уровня вложенности. Можно ли сократить количество запросов средствами ORM?
models.py
class Comment(models.Model):
    post = models.ForeignKey(
        Post, on_delete=models.CASCADE, blank=False, null=False, related_name='comments')
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, blank=False, null=False)
    parent = models.ForeignKey(
        'self', on_delete=models.CASCADE, blank=True, null=True, related_name='children')
    text = models.CharField(max_length=1000, blank=False, null=False, verbose_name='комментарий')

class Photo(models.Model):
    comment = models.ForeignKey(
        Comment, null=True, blank=True,  on_delete=models.CASCADE, related_name='user_photos')
    photo = models.ImageField(upload_to='user-photo/')

templatestags/comments.py
@register.inclusion_tag('comment/comments.html')
def comments(post: 'Queryset[Post]'):
    comments = Comment.objects.filter(
        post=post).prefetch_related('user_photos', 'children').select_related('user', 'parent')

    return {
        'comments': comments,
        'name': post.name
    }

comment/comments.html
{% for i in comments %}
    {% if not i.parent %}
            {{ i.text }}
            {% if i.user_photos.all %}
                {% for img in i.user_photos.all %}
                    <img src="{{ img.thumb.url }}">
                {% endfor %}
            {% endif %}
            {% if i.children %}
                {% for child in i.children.all %}
                    {{ child.text }}
                    {% for img in child.user_photos.all %}
                        <img src="{{ img.thumb.url }}">
                    {% endfor %}
                {% endfor %}
            {% endif %}
    {% endif %}
{% endfor %}

Оборачивание Comment.objects.filter в list или перебор через for in не помогают.
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Можно. Для внешних ключей есть select_related, а для иерархий есть mptt.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы