<- Несколько полезных практик использования запросов в Django ORM
select_related()
Метод select_related() создает запрос, который объединяет связанные объекты. Метод не выполняет дополнительные запросы при доступе к связанным объектам, что может увеличить производительность, но при этом увеличивается объем получаемых данных. Я думаю было бы целесообразно использовать select_related() вместе с методом iterator(), так мы сможем получать большие данные по кусочкам не засоряя память:
users = User.objects.select_related().all()
for user in users.iterator():
...
exists()
Давайте рассмотрим небольшой практический пример:
# Запрос выполняться не будет
users_at_city = User.objects.filter(city='Somecity')
# Тут уже выполнится запрос
if users_at_city:
...
Строка с оператором if выполнит запрос QuerySet, даже если вы никогда не собираетесь использовать результаты данного запроса. Для этих целей было бы целесообразно воспользоваться методом exists():
users_at_city = User.objects.filter(city='Somecity')
if users_at_city.exists():
...
Комбинирование методов exists() и iterator()
Комбинирование двух этих методов позволит нам:
- Проверить существуют ли записи в таблице без получения этих данных (exists)
- Если записи существуют, получить их порциями (iterator)
Пример:
users = User.objects.all()
if users.exists():
for user in users.iterator():
...