Метод iterator
Метод iterator применяется к QuerySet и возвращает итератор,
который загружает записи из базы данных небольшими порциями,
а не все сразу. Это позволяет значительно снизить потребление
памяти при обработке большого количества записей. Метод особенно
полезен при работе с многомиллионными таблицами, где загрузка
всех объектов в память может привести к переполнению памяти.
По умолчанию метод использует курсор сервера для поточной
загрузки данных. Размер порции можно настроить с помощью
параметра chunk_size, который определяет количество
записей, загружаемых за один запрос к базе данных.
Синтаксис
Model.objects.all().iterator(chunk_size=2000)
Пример
Давайте обработаем все статьи из базы данных без загрузки их всех в память:
from myapp.models import Article
res = Article.objects.all().iterator()
for article in res:
print(article.title)
Результат выполнения кода:
"First article"
"Second article"
"Third article"
"Fourth article"
"Fifth article"
Пример
Используем метод с указанием размера порции для более эффективной обработки данных:
from myapp.models import User
res = User.objects.filter(is_active=True).iterator(chunk_size=1000)
for user in res:
print(user.username)
Результат выполнения кода:
"ivanov"
"petrov"
"sidorov"
"smirnov"
"volkov"
Пример
Объединим iterator с фильтрацией и агрегацией для обработки больших объемов данных:
from myapp.models import Order
from django.db.models import Sum
res = Order.objects.filter(status='completed').iterator(chunk_size=500)
total_sum = 0
for order in res:
total_sum += order.amount
print(total_sum)
Результат выполнения кода:
"124500.50"