Массовое создание объектов модели в django
у меня есть много объектов для сохранения в базе данных, и поэтому я хочу создать экземпляры модели с этим.
С django, я могу создать все экземпляры модели, с MyModel(data)
, а затем я хочу спасти их всех.
В настоящее время у меня есть что-то вроде этого:
for item in items:
object = MyModel(name=item.name)
object.save()
мне интересно, могу ли я сохранить список объектов напрямую, например:
objects = []
for item in items:
objects.append(MyModel(name=item.name))
objects.save_all()
как сохранить все объекты в одной транзакции?
8 ответов:
начиная с версии разработки django 1.4, существует
bulk_create
как метод менеджера объекта, который принимает в качестве входных данных массив объектов, созданных с помощью конструктора класса. проверить Джанго документы
использовать метод bulk_create (). Теперь это стандарт в Django: официальная документация Django bulk_create ()
пример:
>>> Entry.objects.bulk_create([ ... Entry(headline="Django 1.0 Released"), ... Entry(headline="Django 1.1 Announced"), ... Entry(headline="Breaking: Django is awesome") ... ])
работал для меня, чтобы использовать ручную обработку транзакций для цикла (postgres 9.1):
from django.db import transaction with transaction.commit_on_success(): for item in items: MyModel.objects.create(name=item.name)
на самом деле это не то же самое, что "родная" массовая вставка базы данных, но она позволяет избежать/descrease transport/orms operations/sql query analyse costs
использование create вызовет один запрос на новый элемент. Если вы хотите уменьшить количество запросов вставки, вам нужно будет использовать что-то еще.
У меня был некоторый успех с использованием фрагмента Bulk Insert, хотя фрагмент довольно старый. Возможно, есть некоторые изменения, необходимые, чтобы заставить его работать снова.
проверить это сообщение в блоге на bulkops модуль.
на моем django 1.3 приложение, я испытал значительное ускорение.
вот как массово создавать объекты из файла, разделенного столбцами, оставляя в стороне все процедуры без кавычек и без экранирования:
SomeModel(Model): @classmethod def from_file(model, file_obj, headers, delimiter): model.objects.bulk_create([ model(**dict(zip(headers, line.split(delimiter)))) for line in file_obj], batch_size=None)