Ответ 1
с версии 1.4 django, существует bulk_create
в качестве метода диспетчера объектов, который принимает в качестве входных данных массив объектов, созданных с помощью конструктора классов. проверить django docs
У меня есть много объектов для сохранения в базе данных, поэтому я хочу создать экземпляры Model с этим.
С 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()
Как сохранить все объекты в одной транзакции?
с версии 1.4 django, существует bulk_create
в качестве метода диспетчера объектов, который принимает в качестве входных данных массив объектов, созданных с помощью конструктора классов. проверить django docs
Используйте bulk_create()
. Это стандартно в Django сейчас.
Пример:
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)
на самом деле это не то же самое, что и встроенная встроенная база данных, но она позволяет вам избегать/сокращать операции переноса/обработки орфографии/анализировать затраты sql-запроса.
Вот как массивно создавать сущности из файла с разделителями-столбцами, оставляя в стороне все нечеткие и неэкранирующие подпрограммы:
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)
для реализации одной строки вы можете использовать выражение лямбда в карте
map(lambda x:MyModel.objects.get_or_create(name=x), items)
Здесь lambda соответствует каждому элементу в списке элементов для x и при необходимости создает запись базы данных.
Использование create вызовет один запрос для нового элемента. Если вы хотите уменьшить количество запросов INSERT, вам нужно будет использовать что-то еще.
У меня был некоторый успех, используя фрагмент Bulk Insert, хотя фрагмент довольно старый. Возможно, есть некоторые изменения, необходимые, чтобы заставить его работать снова.
Просмотрите этот пост в блоге bulkops.
В моем приложении django 1.3 я испытал значительное ускорение.
Самый простой способ - использовать метод create
Manager, который создает и сохраняет объект за один шаг.
for item in items:
MyModel.objects.create(name=item.name)