TG Telegram Group & Channel
Библиотека Python разработчика | Книги по питону | United States America (US)
Create: 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

Оптимизация 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


>>Click here to continue<<

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




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)