2012-05-21 14 views
8

Tengo una lista en la que me gustaría crear entradas bulk_create en la base de datos.Django 1.4 - bulk_create con una lista

¿Cómo puedo hacer esto sin pasar por la lista, lo cual supongo que quitaría el punto de bulk_create.

Por ejemplo:

En lugar de ...

for x in list: 
    bulk_create... 

¿Cómo podría ...

bulk_create for the entire list at once in an efficient manner 

lista contiene:

list = ['abc', 'def', 'ghi'] 

Se trata simplemente de una lista de id's, no en la forma en que se re ady para alimentar directamente a bulk_create (no formateado con los campos de entrada). Sin embargo, supongo que sería posible modificar la lista antes de pasarla a bulk_create.

+0

¿Qué hay en su lista? – jdi

+0

No entiendo. ¿Desea crear una lista de objetos con identificaciones explícitas en lugar de dejar que se autoincredan? ¿Es eso lo que buscas? – jdi

+0

@jdi Cambiaré el ejemplo e intentaré dar un ejemplo más concreto. – snakesNbronies

Respuesta

21

bulk_create toma una lista de objetos como una sola arg, en una sola llamada. Lo que está haciendo en su ejemplo podría ser el mismo que el bucle y haciendo create()

Referencing: https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create

aList = [ 
    Entry(headline="Django 1.0 Released"), 
    Entry(headline="Django 1.1 Announced"), 
    Entry(headline="Breaking: Django is awesome") 
] 
Entry.objects.bulk_create(aList) 

aList se refiere a una lista de objetos que ya ha instanciado y la necesidad de crear a granel con una consulta. Si por ejemplo usted no tuviera ya que no se hayan guardado lista de instancias, y que tenía una lista de valores, entonces podría crear su lista con algo como:

values = ['abc', 'def', 'ghi'] 
# a list of unsaved Entry model instances 
aList = [Entry(headline=val) for val in values] 

O tal vez usted tiene una lista de valores del diccionario primas ese mapa al modelo:

values = [{headline="abc"}, {headline="def"}, {headline="ghi"}] 
aList = [Entry(**vals) for vals in values] 
+0

Esto todavía me requeriría ingresar manualmente los argumentos en 'aList'. ¿Puedes pensar en alguna forma de omitir esto? Ya tengo una lista. Supongo que ** PODRÍA ** convertirlo a una lista de cadenas cada una con exactamente lo que enumeró en una lista? – snakesNbronies

+0

@thong: Creo que es posible que te estés perdiendo el punto. Si ya tiene una lista de objetos, simplemente pase esa lista a 'bulk_create' una vez. Este ejemplo muestra lo que una lista contendría para que usted lo pase. Si todavía está confundido acerca de esta parte, ¿puede actualizar su pregunta para mostrar qué hay en la lista que ya tiene? – jdi

+0

la lista no está en el formato de su lista. Intentaré editar alterando la lista para ver si funciona. – snakesNbronies

3
>>> Entry.objects.bulk_create([ 
...  Entry(headline="Django 1.0 Released"), 
...  Entry(headline="Django 1.1 Announced"), 
...  Entry(headline="Breaking: Django is awesome") 
... ]) 

Estás pasando el ORM una lista de objetos instanciados en una lista. El uso de este, y suponiendo que orig_list es una lista de los diccionarios,

>>> my_objects = [MyObject(a=x['a'], b=x['b']) for x in orig_list] 
>>> MyObject.objects.bulk_create(my_objects) 
1

probar esto, y el punto de bulk_create es golpear la base de datos sólo una vez, no importa cuántos va a crear. Es por eso que lo consideramos eficiente.

class Entry(models.Model): 
    name = models.CharField(max_length = 10) 

a = ['test1', 'test2', 'test3', 'test4'] 

Entry.objects.bulk_create([Entry(name=x) for x in a]) 

--- --- Editar

Digamos que tiene un modelo de este tipo, en su models.py:

class Entry(models.Model): 
    id = models.CharField(max_length = 10) 

y tiene una lista como esta (directamente copiado de su pregunta):

list = ['abc', 'def', 'ghi'] 

simplemente una línea:

Entry.objects.bulk_create([Entry(id=x) for x in list]) 
+0

Esto todavía me requeriría ingresar manualmente los argumentos en la lista a. ¿Puedes pensar en alguna forma de omitir esto? – snakesNbronies

+0

@thong Supongo que pasaste por alto parte de mi respuesta. la lista de aquí es solo para fines de demostración, no es necesario "ingresar manualmente". Ver editar. – xbtsw

+0

gracias! Soy bastante nuevo en la programación, así que no lo conseguí hasta la edición. – snakesNbronies

Cuestiones relacionadas