Si no está seguro de si las cosas en su item_list
ya existen en su base de datos y necesita los objetos modelo, entonces get_or_create
es definitivamente el camino a seguir.
Si conoce los artículos no se encuentran en su base de datos, que sería mucho mejor haciendo:
for item in item_list:
new = Entry.objects.create(
field1 = item.field1,
field2 = item.field2,
)
Y si usted no necesita los objetos, entonces simplemente ignorar el regreso de la llamada a la función. No acelerará las cosas de DB, pero ayudará con la administración de la memoria si eso es un problema.
Si no está seguro de si los datos ya están en la base de datos, pero cualquiera de los campos tiene una bandera unique=True
, entonces la base de datos hará valer la exclusividad y podrá capturar la excepción y continuar. Esto evitará un DB extra al evitar el intento de seleccionar el objeto existente.
from django.db import IntegrityError
for item in item_list:
try:
new = Entry.objects.create(
field1 = item.field1,
field2 = item.field2,
)
except IntegrityError:
continue
Puede aumentar la velocidad en cualquier caso administrando manualmente las transacciones. Django creará y realizará automáticamente una transacción para cada operación de guardado, pero ofrece algunos decoradores que aumentarán en gran medida la eficiencia si sabe que hará una gran cantidad de copias de seguridad en una función en particular. Los documentos de Django hacen un mejor trabajo al explicar todo esto que aquí, pero es probable que desee prestar especial atención a django.db.transaction.commit_on_success
En un comentario, dijiste que necesitabas los modelos.También dijiste que usaste executemany. ¿Cómo obtuviste los modelos cuando usas executemany? – Eddified