Загружаем изображение…

Оптимизация SQL-запросов в Django ORM



Сегодня я покажу вам, как оптимизировать SQL-запросы в Django ORM, чтобы ваш код работал быстрее и эффективнее. Если ваш Django-проект начал тормозить, скорее всего, проблема в количестве и сложности запросов к базе данных.

1️⃣ Используйте select_related и prefetch_related
Django ORM лениво загружает связанные объекты, что может привести к множественным SQL-запросам (N+1). Вместо этого используйте:

# select_related — жадная загрузка (для ForeignKey, OneToOne)
posts = Post.objects.select_related("author").all()

# prefetch_related — для ManyToMany и Reverse ForeignKey
posts = Post.objects.prefetch_related("comments").all()Это значительно уменьшает количество запросов к базе.

2️⃣ Используйте only и defer
Если вам не нужны все поля модели, загружайте только необходимые:

users = User.objects.only("id", "username") # Загружаем только ID и имя
А если хотите исключить несколько полей:

users = User.objects.defer("bio", "last_login") # Исключаем ненужные поля

3️⃣ Агрегация вместо перебора в Python
Вместо:

total_likes = sum(post.likes.count() for post in posts)
Используйте annotate:

from django.db.models import Count

posts = Post.objects.annotate(total_likes=Count("likes"))Это выполнится на стороне базы, а не в Python, что намного быстрее.

4️⃣ Используйте exists() вместо count()
Если вам нужно проверить, есть ли записи в базе, не используйте count(), это дорогостоящий запрос:

if User.objects.filter(email="test@example.com").exists(): # Быстро
❌ Плохо:

if User.objects.filter(email="test@example.com").count() > 0: # Долго

5️⃣ Кешируйте запросы
Django поддерживает кеширование, и если запросы повторяются, можно использовать:

from django.core.cache import cache

users = cache.get("users")
if not users:
users = list(User.objects.all()) # Загружаем пользователей
cache.set("users", users, timeout=60 * 15) # Кешируем на 15 минут

Эти простые приемы помогут вам ускорить Django-приложение и уменьшить нагрузку на базу данных.

👉 @BookPython
Просмотры: 6 544
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти