Сталкивался ли с оптимизацией в Django ORM
Python
Junior
Без компании
Сталкивался ли с оптимизацией в Django ORM
Ответы
Да, сталкивался. Основные подходы к оптимизации Django ORM:
- **select_related()** - для ForeignKey и OneToOneField (JOIN в SQL):
```
books = Book.objects.select_related('author').all() # 1 запрос вместо N+1
```
- **prefetch_related()** - для ManyToManyField и обратных связей:
```
authors = Author.objects.prefetch_related('books').all()
```
- **only()/defer()** - загрузка только нужных полей:
```
users = User.objects.only('username', 'email')
```
- **count() vs exists()**:
```
if Book.objects.filter(author=author).exists(): # Лучше чем count() > 0
```
- **bulk_create/update** для массовых операций:
```
Book.objects.bulk_create([Book(...), Book(...)])
```
- **Индексы** в моделях:
```
class Meta:
indexes = [models.Index(fields=['title'])]
```
- **connection.queries** для дебага:
```
from django.db import connection
print(connection.queries)
```
Важно анализировать конкретные запросы через django-debug-toolbar или EXPLAIN.