РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
76 of 818 menu

Метод bulk_create

Метод bulk_create применяется к менеджеру модели и позволяет создать множество объектов за один SQL-запрос. Вместо того чтобы вызывать save для каждого объекта по отдельности, метод принимает список экземпляров модели и вставляет их все одновременно. Это особенно полезно при импорте больших объемов данных или при пакетной обработке информации.

Метод принимает следующие основные параметры:

  • objs (обязательный) - список или итерируемый объект с экземплярами модели для создания
  • batch_size (необязательный) - количество объектов, вставляемых за один запрос (по умолчанию зависит от базы данных)
  • ignore_conflicts (необязательный) - если установлен в True, конфликты уникальности игнорируются

Важно отметить, что метод не вызывает сигналы pre_save и post_save для каждого объекта. Также не заполняются поля с автоматическим увеличением (автоинкрементные поля) у созданных объектов в некоторых базах данных.

Синтаксис

Model.objects.bulk_create(objs, batch_size=None, ignore_conflicts=False)

Пример

Создадим несколько статей одной операцией:

from myapp.models import Article from django.utils import timezone # Create a list of articles articles = [ Article( title='First Article', content='Content of first article', status='draft', created_at=timezone.now() ), Article( title='Second Article', content='Content of second article', status='draft', created_at=timezone.now() ), Article( title='Third Article', content='Content of third article', status='draft', created_at=timezone.now() ), ] # Bulk create all articles res = Article.objects.bulk_create(articles) print(f"Created {len(res)} articles")

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

"Created 3 articles"

Пример

Используем параметр batch_size для контроля размера пакета при массовой вставке:

from myapp.models import Article from django.utils import timezone # Create 100 articles articles = [] for i in range(100): articles.append( Article( title=f'Article {i}', content=f'Content of article {i}', status='draft', created_at=timezone.now() ) ) # Insert in batches of 10 res = Article.objects.bulk_create(articles, batch_size=10) print(f"Created {len(res)} articles in batches of 10")

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

"Created 100 articles in batches of 10"

Пример

Игнорируем конфликты уникальности при массовом создании с параметром ignore_conflicts:

from myapp.models import Article # Articles with duplicate titles (if title is unique) articles = [ Article(title='Unique Title', content='Content 1'), Article(title='Unique Title', content='Content 2'), # Duplicate Article(title='Another Title', content='Content 3'), ] # Ignore conflicts and insert only non-duplicate records res = Article.objects.bulk_create(articles, ignore_conflicts=True) print(f"Successfully inserted: {len(res)} articles")

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

"Successfully inserted: 2 articles"

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

  • метод bulk_update,
    который массово обновляет объекты в базе данных
  • метод create,
    который создает и сохраняет один объект в базе данных
  • метод get_or_create,
    который получает или создает объект в базе данных
  • метод update_or_create,
    который обновляет или создает объект в базе данных
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить