Метод 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,
который обновляет или создает объект в базе данных