TGStat
TGStat
Введите текст для поиска
Расширенный поиск каналов
  • flag Russian
    Язык сайта
    flag Russian flag English flag Uzbek
  • Вход на сайт
  • Каталог
    Каталог каналов и чатов Региональные подборки Тематические подборки Платные каналы Поиск каналов
    Добавить канал/чат
  • Рейтинги
    Рейтинг каналов Рейтинг чатов Рейтинг публикаций
    Рейтинги брендов и персон
  • Аналитика
  • Поиск по публикациям
  • Мониторинг Telegram
  • Продвижение
    Реклама через Яндекс Бизнес Реклама в каналах через TGStat Agency Реклама на сайте TGStat.ru
Библиотека Python разработчика | Книги по питону

1 Sep, 09:50

Открыть в Telegram Поделиться Пожаловаться

Оптимизация 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-приложение и уменьшить нагрузку на базу данных. А вы уже используете их в своих проектах? Делитесь в комментариях! 👇

📲 Мы в MAX

👉@BookPython

1k 0 6 3
Каталог
Каталог каналов и чатов Подборки каналов Поиск каналов Добавить канал/чат
Рейтинги
Рейтинг каналов Telegram Рейтинг чатов Telegram Рейтинг публикаций Рейтинги брендов и персон
API
API статистики API поиска публикаций API Callback
Наши каналы
@TGStat @TGStat_Chat @telepulse @TGStatAPI
Почитать
Академия TGStat Исследование Telegram 2019 Исследование Telegram 2021 Исследование Telegram 2023
Контакты
Справочный центр Поддержка Почта Вакансии
Всякая всячина
Пользовательское соглашение Политика конфиденциальности Публичная оферта
Наши боты
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot