Недавно я столкнулся с некоторым странным поведением, и мне нужно проверить свое понимание.
Я использую простой фильтр в модели, а затем перебираю результаты.
например
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, который уже был оценен, заставит его оцените еще раз, повторив запрос.