Использование iterator () в наборе запросов django

Недавно я столкнулся с некоторым странным поведением, и мне нужно проверить свое понимание.

Я использую простой фильтр в модели, а затем перебираю результаты.

например

allbooks = Book.objects.filter(author='A.A. Milne')

for book in allbooks:
   do_something(book)

как ни странно, он возвращал только частичный список книг.

Однако при использовании того же кода и использовании iterator () это, похоже, работает хорошо.

т.е.

for book in allbooks.iterator():
    do_something(book)

Любая идея почему?

ps Я просмотрел документацию Django, но не вижу, как набор запросов будет кэшироваться где-нибудь еще ...

iterator () m, используя простой фильтр в модели и затем перебирая результаты.

например

allbooks = Book.objects.filter(author='A.A. Milne')

for book in allbooks:
   do_something(book)

как ни странно, он возвращал только частичный список книг.

Однако при использовании того же кода и при использовании iterator () это, похоже, работает хорошо.

т.е.

for book in allbooks.iterator():
    do_something(book)

Есть идеи, почему?

ps Я просмотрел документацию Django, но не вижу как набор запросов будет кэшироваться где-нибудь еще ...

iterator () m, используя простой фильтр в модели и затем перебирая результаты.

например,

allbooks = Book.objects.filter(author='A.A. Milne')

for book in allbooks:
   do_something(book)

как ни странно, он возвращал только частичный список книг.

Однако при использовании того же кода и при использовании iterator () это, похоже, работает хорошо.

т.е.

for book in allbooks.iterator():
    do_something(book)

Есть идеи, почему?

ps Я просмотрел документацию Django, но не вижу как набор запросов будет кэшироваться где-нибудь еще ...

iterator () Оценивает QuerySet (путем выполнения запроса) и возвращает итератор по результатам. QuerySet обычно кэширует свои результаты во внутреннем кэше, чтобы повторные оценки не приводили к дополнительным запросам; iterator () вместо этого будет читать результаты напрямую, без какого-либо кэширования на уровне QuerySet. Для QuerySet, который возвращает большое количество объектов, это часто приводит к повышению производительности и значительному сокращению памяти

. Обратите внимание, что использование iterator () в QuerySet, который уже был оценен, заставит его оцените еще раз, повторив запрос.

14
задан funnydman 5 November 2019 в 16:02
поделиться