У каждого QuerySet есть встроенный кеш результатов - _result_cache. QuerySet ленивый - в БД не идет, пока его не начнут вызывать. При первой полной итерации запрос выполняется, результат складывается в кеш инстанса. Вторая итерация того же инстанса - уже из памяти Один и тот же запрос дважды это два разных QuerySet # два запроса в БД print([e.headline for e in Entry.objects.all()]) print([e.pub_date for e in Entry.objects.all()]) # один запрос entries = Entry.objects.all() print([e.headline for e in entries]) print([e.pub_date for e in entries]) Кеш живет на инстансе QuerySet, не на запросе. Каждый вызов .all() создает новый инстанс с пустым кешем - даже если SQL идентичный Не все обращения заполняют кеш qs = Entry.objects.all() print(qs) # __repr__ - НЕ кеширует print(qs[5]) # SELECT с LIMIT/OFFSET - запрос print(qs[5]) # еще один запрос Заполняют кеш: [entry for entry in qs] # полная итерация list(qs) # материализация bool(qs) # if qs: entry