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

👉@BookPython
👍9



tgoop.com/BookPython/3520
Create:
Last Update:

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

👉@BookPython

BY Библиотека Python разработчика | Книги по питону


Share with your friend now:
tgoop.com/BookPython/3520

View MORE
Open in Telegram


Telegram News

Date: |

According to media reports, the privacy watchdog was considering “blacklisting” some online platforms that have repeatedly posted doxxing information, with sources saying most messages were shared on Telegram. Joined by Telegram's representative in Brazil, Alan Campos, Perekopsky noted the platform was unable to cater to some of the TSE requests due to the company's operational setup. But Perekopsky added that these requests could be studied for future implementation. Developing social channels based on exchanging a single message isn’t exactly new, of course. Back in 2014, the “Yo” app was launched with the sole purpose of enabling users to send each other the greeting “Yo.” A vandalised bank during the 2019 protest. File photo: May James/HKFP. Some Telegram Channels content management tips
from us


Telegram Библиотека Python разработчика | Книги по питону
FROM American