Веб-версияОткрыть в Telegram

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

1 сентября 2026
Б
Библиотека Python разработчика | Книги по питону
Оптимизация 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="[email protected]").exists(): # Быстро ❌ Плохо: if User.objects.filter(email="[email protected]").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-приложение и уменьшить нагрузку на базу данных. А вы уже используете их в своих проектах? Делитесь в комментариях! 👇 📲 Мы в MAX 👉@BookPython
6 · 1.1K ·

Рядом в ленте

ББиблиотека Python разработчика | Книги по питонуPython поддерживает несколько способов запуска скрипта. Обычный вариант — это python foo.py; в этом случае foo.py просто выполняется. Однако, можно также испольББиблиотека Python разработчика | Книги по питонуОптимизация кода с помощью генераторов в Python Сегодня хочу показать вам, как использование генераторов может сделать ваш код быстрее, экономнее по памяти и эл
это сообщение
ББиблиотека Python разработчика | Книги по питонуStructured Concurrency в Python 3.11+ (TaskGroup vs Gather) Если вы до сих пор используете asyncio.gather() для запуска конкурентных задач, вы, вероятно, теряетББиблиотека Python разработчика | Книги по питонуСписковые включения (list comprehensions) могут содержать несколько операторов for и if: In : [(x, y) for x in range(3) for y in range(3)] Out: [ (0, 0), (0, 1)
ББиблиотека Python разработчика | Книги по питонуБиблиотека Python разработчика | Книги по питону@BookPython · канал · Технологии
18 046подписчиков901средний охват поста
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем