2010-11-18 10 views
30

No he visto nada sobre este tema en los documentos en línea de Django.Pregunta sobre objetos de salvar por lotes en Django

Estoy tratando de guardar una lista de objetos en la base de datos, pero lo que puedo hacer es recorrer la lista y llamar a save() en cada objeto.

¿Lo hace varias veces la base de datos de Django? ¿O Django hará un ahorro por lotes en su lugar?

+0

Quizás valga la pena cambiar la respuesta aceptada ahora que bulk_create() está disponible en django 1.4 y hasta – DMTintner

Respuesta

10

Desafortunadamente, las inserciones por lotes son algo que Django 1.3 y anteriores no admiten directamente. Si desea utilizar el ORM, debe llamar a save() en cada objeto individual. Si se trata de una lista extensa y el rendimiento es un problema, puede usar django.db.cursor para INSERTAR los elementos manualmente dentro de una transacción para acelerar drásticamente el proceso. Si tiene un gran conjunto de datos, debe comenzar a buscar los métodos específicos del motor de base de datos, como COPY FROM en Postgres.

+3

¿Esto sigue siendo cierto con django 1.5? – maazza

+6

No - vea la respuesta a continuación. A partir de 1.4, 'bulk_create()' manejará inserciones de datos a granel eficientes. (https://docs.djangoproject.com/en/1.5/ref/models/querysets/#bulk-create) –

+1

¿Copiar desde todavía es mucho mejor que bulk_create? – sharafjaffri

1

This podría ser un buen punto de partida, pero como dice el autor del fragmento de código, puede que no esté listo para la producción.

35

A partir de Django 1.4, existe un método bulk_create() en el objeto QuerySet, que permite insertar una lista de objetos en una sola consulta. Para obtener más información, ver:

+0

¡Muy bonito! Debería actualizar a 1.4 entonces. – netvope

+0

bulk_create es increíble pero, por desgracia, no es compatible con modelos heredados. alguna idea para manejar eso? –

+0

Note en particular que "[si la clave primaria del modelo es un AutoField no recupera ni establece el atributo de clave principal, como lo hace save(), a menos que el backend de la base de datos lo soporte (actualmente PostgreSQL)] (https: // docs. djangoproject.com/en/dev/ref/models/querysets/#bulk-create) ". – Ninjakannon

2

De Django 1.4 bulk_create() existe, pero, siempre, pero.

Debe tener cuidado, usando bulk_create() no llamará al método de instancia save() internamente.

Como Django docs dice

El método del modelo, salvo() no se llamará

lo tanto, si está sustituyendo método para guardar, (como mi caso fue) no se puede utilizar bulk_create