2010-11-18 1 views
30

Non ho visto nulla su questo argomento nei documenti online di Django.Domanda sugli oggetti di salvataggio batch in Django

Sto cercando di salvare un elenco di oggetti nel database, ma quello che posso fare è scorrere l'elenco e chiamare save() su ogni oggetto.

Quindi Django ha colpito il database più volte? Oppure Django farà un solo salvataggio, invece?

+0

Forse vale la pena cambiare la risposta accettata ora che bulk_create() è disponibile in django 1.4 e fino – DMTintner

risposta

10

Sfortunatamente, gli inserimenti batch sono qualcosa che Django 1.3 e precedenti non supportano direttamente. Se si desidera utilizzare l'ORM, è necessario chiamare save() su ogni singolo oggetto. Se si tratta di un elenco di grandi dimensioni e le prestazioni rappresentano un problema, è possibile utilizzare django.db.cursor per INSERIRE gli elementi manualmente all'interno di una transazione per accelerare notevolmente il processo. Se si dispone di un set di dati enorme, è necessario iniziare a esaminare i metodi specifici del motore di database, ad esempio COPY FROM in Postgres.

+3

è ancora valido con django 1.5? – maazza

+6

No - guarda la risposta qui sotto. A partire da 1.4, 'bulk_create()' gestirà efficienti inserimenti di dati di massa. (https://docs.djangoproject.com/en/1.5/ref/models/querysets/#bulk-create) –

+1

Copia da è ancora molto meglio di bulk_create? – sharafjaffri

1

This potrebbe essere un buon punto di partenza, ma come dice l'autore del frammento di codice, potrebbe non essere pronto per la produzione.

35

A partire da Django 1.4, esiste un metodo bulk_create() sull'oggetto QuerySet, che consente di inserire un elenco di oggetti in una singola query. Per maggiori informazioni, si veda:

+0

Molto bello! Dovrei aggiornare a 1.4 allora. – netvope

+0

bulk_create è fantastico ma, purtroppo, non supporta i modelli ereditati. qualche idea per gestirlo? –

+0

Si noti in particolare che "[se la chiave primaria del modello è un campo automatico, non recupera e imposta l'attributo della chiave primaria, come save(), a meno che il back-end del database non supporti (attualmente PostgreSQL)] (https: // docs. djangoproject.com/en/dev/ref/models/querysets/#bulk-create)". – Ninjakannon

2

Da Django 1.4 esiste bulk_create(), ma, sempre ma.

È necessario prestare attenzione, utilizzando bulk_create() non chiama internamente il metodo istanza save().

Come Django docs dice

metodo del modello di save() non sarà chiamato

Quindi, se stai facendo override metodo di salvataggio, (come il mio caso è stato) non è possibile utilizzare bulk_create.