2010-11-18 3 views
30

Я не видел ни одной вещи в этой теме в онлайн-документах Django.Вопрос о пакетных сберегательных объектах в Django

Я пытаюсь сохранить список объектов в базе данных, но то, что я могу сделать, - это цикл по списку и вызов save() для каждого объекта.

Так что Django попадает в базу данных несколько раз? Или Django будет делать одно пакетное сохранение вместо этого?

+0

Возможно, стоит изменить принятый ответ, что bulk_create() доступен в django 1.4 и до – DMTintner

ответ

10

К сожалению, пакетные вставки - это то, что Django 1.3 и ранее не поддерживают напрямую. Если вы хотите использовать ORM, вам нужно вызвать save() для каждого отдельного объекта. Если это большой список и производительность - проблема, вы можете использовать django.db.cursor для INSERT элементов вручную внутри транзакции, чтобы резко ускорить процесс. Если у вас есть огромный набор данных, вам нужно начать искать специфичные для базы данных методы, например COPY FROM в Postgres.

+3

Это все еще верно для django 1.5? – maazza

+6

Нет - см. Ответ ниже. Начиная с версии 1.4, 'bulk_create()' будет обрабатывать эффективные вставки объемных данных. (https://docs.djangoproject.com/en/1.5/ref/models/querysets/#bulk-create) –

+1

Копировать От еще намного лучше, чем bulk_create? – sharafjaffri

1

This может быть хорошей отправной точкой, но, как говорит автор фрагмента кода, он может быть не готов к производству.

35

Начиная с Django 1.4 существует метод bulk_create() объекта QuerySet, который позволяет вставлять список объектов в один запрос. Для получения дополнительной информации см:

+0

Очень приятно! Тогда я должен обновиться до 1.4. – netvope

+0

bulk_create потрясающий, но, к сожалению, он не поддерживает унаследованные модели. любая идея справиться с этим? –

+0

Обратите внимание, в частности, что «если первичный ключ модели - это AutoField, он не извлекает и не устанавливает атрибут первичного ключа, как это делает save(), если только бэкэнд базы данных не поддерживает его (в настоящее время PostgreSQL)] (https: // docs. djangoproject.com/en/dev/ref/models/querysets/#bulk-create)». – Ninjakannon

2

С Django 1.4 существует bulk_create(), но всегда, но.

Вы должны быть осторожны, используя bulk_create() это не вызовет экземпляр save() метод внутри.

Как Джанго Docs говорит

метод этой модели сохранения() не будет называться

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

Смежные вопросы