Nate C беше близо, но не съвсем.
От документите:
Можете да оцените QuerySet по следните начини:
Повторение. QuerySet е итерируем и изпълнява своята заявка за база данни при първия път, когато го повторите. Например, това ще отпечата заглавието на всички записи в базата данни:
for e in Entry.objects.all(): print e.headline
Така че вашите десет милиона реда се извличат наведнъж, когато за първи път влезете в този цикъл и получите повторящата се форма на набора от заявки. Чакането, което изпитвате, е Django, който зарежда редовете на базата данни и създава обекти за всеки от тях, преди да върне нещо, което всъщност можете да повторите. Тогава имате всичко в паметта и резултатите излизат на бял свят.
От моя прочит на документите, iterator()
не прави нищо повече от заобикаляне на вътрешните механизми за кеширане на QuerySet. Мисля, че може да има смисъл да се прави едно по едно нещо, но това ще изисква десет милиона отделни посещения във вашата база данни. Може би не е толкова желано.
Ефективното итериране на големи набори от данни е нещо, което все още не сме се оправили съвсем правилно, но има някои фрагменти, които може да намерите полезни за вашите цели:
- Ефективен от паметта итератор на Django QuerySet
- пакетни набори от заявки
- QuerySet Foreach