Guardando muchos objetos Django con una gran instrucción INSERT

Imagina que tienes la siguiente situación:

for i in xrange(100000): account = Account() account.foo = i account.save 

Obviamente, las 100.000 INSERT ejecutadas por Django van a tomar algún tiempo. Sería mejor poder combinar todos esos INSERT s en un gran INSERT . Este es el tipo de cosas que espero poder hacer:

 inserts = [] for i in xrange(100000): account = Account() account.foo = i inserts.append(account.insert_sql) sql = 'INSERT INTO whatever... ' + ', '.join(inserts) 

¿Hay una manera de hacer esto usando QuerySet, sin generar manualmente todas esas declaraciones INSERT ?

Usted podría utilizar SQL en bruto.

Ya sea por Account.objects.raw() o mediante un objeto django.db.connection.

Esto podría no ser una opción si desea mantener el agnosticismo de la base de datos.

http://docs.djangoproject.com/en/dev/topics/db/sql/

Si lo que estás haciendo es una configuración de una sola vez, tal vez sería mejor utilizar un dispositivo.

Como se muestra en esta pregunta relacionada , se puede usar @ transaction.commit_manually para combinar todas las operaciones .save() como un único compromiso para mejorar en gran medida el rendimiento.

 @transaction.commit_manually def your_view(request): try: for i in xrange(100000): account = Account() account.foo = i account.save() except: transaction.rollback() else: transaction.commit() 

Alternativamente, si te sientes aventurero, mira este fragmento que implementa un administrador para la inserción masiva. Tenga en cuenta que funciona solo con MySQL y no se ha actualizado en mucho tiempo, por lo que es difícil saber si funcionará bien con las versiones más recientes de Django.