Se non sei sicuro che le cose nel tuo item_list
esistano già nel tuo DB e hai bisogno degli oggetti del modello, allora get_or_create
è sicuramente la strada da percorrere.
Se si conoscono le voci non sono nel vostro DB, si sarebbe molto meglio fare:
for item in item_list:
new = Entry.objects.create(
field1 = item.field1,
field2 = item.field2,
)
E se non avete bisogno di oggetti, quindi basta ignorare il ritorno dalla chiamata di funzione. Non accelererà le cose di DB, ma aiuterà con la gestione della memoria se questo è un problema.
Se non si è certi che i dati siano già nel DB, ma su entrambi i campi è presente un flag unique=True
, il DB imporrà l'univocità e sarà possibile rilevare l'eccezione e andare avanti. Ciò impedirà un ulteriore impatto del database evitando il tentativo di selezionare l'oggetto esistente.
from django.db import IntegrityError
for item in item_list:
try:
new = Entry.objects.create(
field1 = item.field1,
field2 = item.field2,
)
except IntegrityError:
continue
È possibile aumentare la velocità in entrambi i casi gestendo manualmente le transazioni. Django creerà e commetterà automaticamente una transazione per ogni salvataggio, ma fornisce alcuni decoratori che aumenteranno notevolmente l'efficienza se saprai che eseguirai molti salvataggi DB in una particolare funzione. I documenti di Django fanno un lavoro migliore per spiegare tutto questo di quanto posso qui, ma probabilmente vorresti prestare particolare attenzione a django.db.transaction.commit_on_success
fonte
2010-02-12 15:42:58
In un commento, hai detto che avevi bisogno dei modelli.Hai anche detto che hai usato executemany. Come hai ottenuto i modelli quando usavi executemany? – Eddified