Sobes.tech
Back to questions
Junior — Middle
52

Могли бы вы объяснить, каким образом можно улучшить производительность запросов при использовании Django ORM?

Companies where asked
СБЕРСБЕР

Answer from AI

sobes.tech AI

Для улучшения производительности запросов в Django ORM можно использовать несколько подходов:

  • select_related() — для жадной загрузки связанных объектов через ForeignKey или OneToOneField, что уменьшает количество SQL-запросов.
  • prefetch_related() — для загрузки связанных объектов ManyToMany или обратных связей, выполняет отдельный запрос, но оптимизирует выборку.
  • values() и values_list() — для выборки только нужных полей, что снижает объем передаваемых данных.
  • annotate() и aggregate() — для выполнения вычислений на уровне базы данных, уменьшая обработку в Python.
  • Использование QuerySet.exists() вместо получения всех объектов, если нужно проверить наличие.
  • Кэширование результатов запросов, если данные не меняются часто.

Пример использования select_related:

# Без select_related: 1 запрос на книги + N запросов на авторов
books = Book.objects.all()
for book in books:
    print(book.author.name)

# С select_related: 1 запрос с JOIN
books = Book.objects.select_related('author').all()
for book in books:
    print(book.author.name)