Метод bulk_create

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

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

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

Синтаксис

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

Пример

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

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

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

python"Created 3 articles"

Пример

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

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

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

python"Created 100 articles in batches of 10"

Пример

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

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

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

python"Successfully inserted: 2 articles"

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

  • метод bulk_update,
    который массово обновляет объекты в базе данных
  • метод create,
    который создает и сохраняет один объект в базе данных
  • метод get_or_create,
    который получает или создает объект в базе данных
  • метод update_or_create,
    который обновляет или создает объект в базе данных