2013-06-28 9 views
13

Ho due modelli come segue:aggiornamento di massa per molti a molti campi

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    year = models.IntegerField(max_lenght=4) 
    author = models.ManyToManyField(null=true, blank=true) 


class Author(models.CustomUser): 
    # some fields 

Ora, quello che sto cercando di fare è aggiungere un Author a più Book oggetti senza l'iterazione sulla lista degli oggetti del libro.

Il metodo di aggiornamento di Django non supporta ManyToManyField come da docs. Dice

È possibile impostare solo campi non di relazione e campi ForeignKey utilizzando questo metodo. Per aggiornare un campo di non relazione, fornire il nuovo valore come costante. Per aggiornare i campi ForeignKey, impostare il nuovo valore come nuova istanza del modello a cui si desidera puntare.

così attualmente sto facendo quanto segue che è altamente inefficiente in quanto andrò a colpire il database per ogni oggetto libro.

author = Author.objects.get(pk=1) 
books = Book.objects.filter(**kwargs) # say this returns 100 objects 
# each loop here will hit the database making it really inefficient 
# for long lists. 
for book in books: 
    book.authors.add(author) 
    book.save() 

Sono abbastanza sicuro che ci sia un modo per aggirare questo, ma io sono solo in grado di trovare nella documentazione. Qualsiasi aiuto sarebbe apprezzato. Grazie

+2

https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_many/ controllare questo ..... Aggiunta tramite l'altra estremità di una sezione m2m .... – boltsfrombluesky

+0

possibile duplicato di [Come creare un oggetto per un modello Django con un campo molti a molti?] (http://stackoverflow.com/questions/6996176/how-to-create-an-object-for-a-django-model- with-a-many-to-many-field) – Pureferret

risposta

10

La risposta è qui:
https://stackoverflow.com/a/10116452/202168

In breve, (in Django> = 1.4) si può fare un bulk_create sulla attraverso il modello, anche se non è stato definito un modello personalizzato tramite.

+8

grazie per il down-voter anonimo down down ... cosa sarebbe ancora più utile aggiungere un commento spiegando brevemente cosa c'è di sbagliato nella mia risposta – Anentropic

+0

non so chi ha downvoted: linked la risposta è solida – Bartvds

+0

@Anentropic Link punta alla risposta corretta. +1 –