Массовое создание объектов модели в 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 57

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, хотя фрагмент довольно старый. Возможно, есть некоторые изменения, необходимые, чтобы заставить его работать снова.

http://djangosnippets.org/snippets/446/

проверить это сообщение в блоге на 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)

для реализации одной строки вы можете использовать лямбда-выражение в map

map(lambda x:MyModel.objects.get_or_create(name=x), items)

здесь лямбда соответствует каждому элементу в списке элементов x и при необходимости создает запись базы данных.

Лямбда Документации

самый простой способ-использовать create метод, который создает и сохраняет объект в один шаг.

for item in items:
    MyModel.objects.create(name=item.name)