Несколько полезных практик использования запросов в Django ORM

Ali Aliev [2015-06-21]

Table Of Contents

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():
        ...
Fork me on GitHub