Приходилось ли оптимизировать запросы в Django

Python Junior Без компании
Приходилось ли оптимизировать запросы в Django
Ответы
Да, приходилось. Основные методы оптимизации запросов в Django: - **select_related()** - для ForeignKey и OneToOne полей (JOIN в SQL): ``` # До оптимизации: N+1 запрос books = Book.objects.all() for book in books: print(book.author.name) # Отдельный запрос для каждого автора # После: books = Book.objects.select_related('author').all() ``` - **prefetch_related()** - для ManyToMany и обратных ForeignKey отношений: ``` # Оптимизация для ManyToMany publishers = Publisher.objects.prefetch_related('books').all() ``` - **only()/defer()** - загрузка только нужных полей: ``` # Загружаем только title и author_id books = Book.objects.only('title', 'author') ``` - **count() vs exists()** - для проверки наличия записей: ``` # Лучше использовать exists() если нужно только проверить наличие if Book.objects.filter(title='Python').exists(): ``` - **Индексы** - добавление db_index=True для часто фильтруемых полей. - **annotate()** вместо множества отдельных запросов. Важно анализировать запросы через django-debug-toolbar и explain() для понимания узких мест.