Приходилось ли оптимизировать запросы в 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() для понимания узких мест.