Вопрос о пакетах сохранения объектов в Django
Я ничего не видел в этой теме в онлайн-документах Django.
Я пытаюсь сохранить список объектов в базе данных, но то, что я могу сделать, - это цикл через список и вызов save() для каждого объекта.
Так что Django попадает в базу данных несколько раз? Или Django будет делать одно пакетное сохранение вместо этого?
Ответы
Ответ 1
К сожалению, пакетные вставки - это то, что Django 1.3 и ранее не поддерживают напрямую. Если вы хотите использовать ORM, вам нужно вызвать save() для каждого отдельного объекта. Если это большой список и производительность является проблемой, вы можете использовать django.db.cursor для INSERT элементов вручную внутри транзакции, чтобы значительно ускорить процесс. Если у вас есть огромный набор данных, вам нужно начать искать специфические для базы данных методы, такие как COPY FROM в Postgres.
Ответ 2
Как и в Django 1.4, на объекте QuerySet существует метод bulk_create()
, который позволяет вставлять список объектов в один запрос. Для получения дополнительной информации см.:
Ответ 3
Этот вопрос также рассмотрен в Как выполнить пакетную вставку в Django?, которая предоставляет некоторые способы сделать Django этим.
Ответ 4
Из Django 1.4 существует bulk_create()
, но всегда, но.
Вам нужно быть осторожным, используя bulk_create()
он не будет внутренне вызывать метод экземпляра save()
.
Как сообщает django docs,
Метод save() не будет вызываться
Итак, если вы переопределяете метод сохранения (в моем случае), вы не можете использовать bulk_create.
Ответ 5
Это может быть хорошей отправной точкой, но, как говорит автор фрагмента кода, он может быть не готов к производству.