Массовое создание объектов модели в django

У меня есть много объектов для сохранения в базе данных, поэтому я хочу создать экземпляры 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

с версии 1.4 django, существует bulk_create в качестве метода диспетчера объектов, который принимает в качестве входных данных массив объектов, созданных с помощью конструктора классов. проверить django docs

Ответ 2

Используйте 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")
])

Ответ 3

работал у меня, чтобы использовать ручную обработку транзакций для цикла (postgres 9.1):

from django.db import transaction
with transaction.commit_on_success():
    for item in items:
        MyModel.objects.create(name=item.name)

на самом деле это не то же самое, что и встроенная встроенная база данных, но она позволяет вам избегать/сокращать операции переноса/обработки орфографии/анализировать затраты sql-запроса.

Ответ 4

Вот как массивно создавать сущности из файла с разделителями-столбцами, оставляя в стороне все нечеткие и неэкранирующие подпрограммы:

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)

Ответ 5

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

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

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

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

Ответ 6

Использование create вызовет один запрос для нового элемента. Если вы хотите уменьшить количество запросов INSERT, вам нужно будет использовать что-то еще.

У меня был некоторый успех, используя фрагмент Bulk Insert, хотя фрагмент довольно старый. Возможно, есть некоторые изменения, необходимые, чтобы заставить его работать снова.

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

Ответ 7

Просмотрите этот пост в блоге bulkops.

В моем приложении django 1.3 я испытал значительное ускорение.

Ответ 8

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

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