Метод iterator

Метод iterator применяется к QuerySet и возвращает итератор, который загружает записи из базы данных небольшими порциями, а не все сразу. Это позволяет значительно снизить потребление памяти при обработке большого количества записей. Метод особенно полезен при работе с многомиллионными таблицами, где загрузка всех объектов в память может привести к переполнению памяти.

По умолчанию метод использует курсор сервера для поточной загрузки данных. Размер порции можно настроить с помощью параметра chunk_size, который определяет количество записей, загружаемых за один запрос к базе данных.

Синтаксис

pythonModel.objects.all().iterator(chunk_size=2000)

Пример

Давайте обработаем все статьи из базы данных без загрузки их всех в память:

pythonfrom myapp.models import Article

res = Article.objects.all().iterator()
for article in res:
  print(article.title)

Результат выполнения кода:

python"First article"
"Second article"
"Third article"
"Fourth article"
"Fifth article"

Пример

Используем метод с указанием размера порции для более эффективной обработки данных:

pythonfrom myapp.models import User

res = User.objects.filter(is_active=True).iterator(chunk_size=1000)
for user in res:
  print(user.username)

Результат выполнения кода:

python"ivanov"
"petrov"
"sidorov"
"smirnov"
"volkov"

Пример

Объединим iterator с фильтрацией и агрегацией для обработки больших объемов данных:

pythonfrom 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)

Результат выполнения кода:

python"124500.50"

Смотрите также

  • метод all,
    который возвращает все записи из QuerySet
  • метод only,
    который загружает только указанные поля модели
  • метод defer,
    который откладывает загрузку указанных полей
  • метод values,
    который возвращает QuerySet словарей вместо объектов