Django: exists() с использованием кэша queryset

Использует ли метод django QuerySet.exists() кэш queryset, если его вызвать дважды? Например

# this makes a call to db
queryset.exists()
# > true

# does it make a call to the db or reuse some cached result?
queryset.exists()
# > true

Я знаю, что len(queryset) не будет выполнять вызов db, если он был ранее оценен. То же самое можно сказать о exists?

Если вы используете .exists() дважды, это сделает два запроса, queryset будет не кэшировать результат вызова .exists().

Если же вы планируете перечислять по кверисету, вы можете проверить истинность кверисета с помощью:

if queryset:
    # not empty
    pass
else:
    # empty
    pass

Это сделает запрос и загрузит записи в кэш кверисета, поэтому последующее перечисление по кверисету, применение len(…) и т.д. не вызовет нового запроса.

Однако этого следует избегать, если вас интересует только проверка существования элемента, по той же причине следует использовать .count() [Django-doc] вместо len(…), если вас интересует только количество записей: при использовании len(…) вы загружаете records в память, что дороже, чем выполнение SELECT COUNT(*) запроса.

Вернуться на верх