2013-06-28 3 views
13

Ich habe zwei Modelle wie folgt:Massenaktualisierung für viele zu viele Felder

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 

Nun, was ich suche ist eine Author auf mehrere Book Objekte zu tun hinzufügen, ohne über die Liste von Buchobjekten iterieren.

Djangos Update-Methode unterstützt ManyToManyField nicht gemäß docs. Es heißt

Sie können nur Non-Relation-Felder und ForeignKey-Felder mit dieser Methode festlegen. Um ein nicht relationales Feld zu aktualisieren, geben Sie den neuen Wert als Konstante an. Um ForeignKey-Felder zu aktualisieren, legen Sie den neuen Wert als neue Modellinstanz fest, auf die Sie verweisen möchten.

so mache ich derzeit das Folgende, das sehr ineffizient ist, da ich die Datenbank für jedes Buchobjekt schlagen werde.

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() 

Ich bin ziemlich sicher, dass es eine Möglichkeit, dies zu umgehen ist, aber ich bin einfach nicht in der Lage es in der Dokumentation zu finden. Jede Hilfe wäre willkommen. Dank

+2

https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_many/ Überprüfen Sie dies ..... Hinzufügen über das 'andere' Ende eines m2m Abschnittes .... – boltsfrombluesky

+0

möglich duplizieren von [Wie man ein Objekt für ein Django-Modell mit einem vielen zu vielen Feld erstellt?] (http://stackoverflow.com/questions/6996176/how-to-create-an-object-for-a-django-model- with-a-many-to-many-field) – Pureferret

Antwort

10

Die Antwort ist hier:
https://stackoverflow.com/a/10116452/202168

Kurz gesagt (in Django> = 1.4) Sie bulk_create auf dem durch Modell tun, auch wenn Sie nicht ein benutzerdefinierte durch Modell definiert haben.

+8

danke für die down-stimme anonymous down-voter ... was noch hilfreicher wäre, einen kommentar hinzuzufügen, der kurz erklärt, was mit meiner antwort falsch ist – Anentropic

+0

weiß nicht, wer downvoted: verlinkt Antwort ist solide – Bartvds

+0

@Anentropic Link zeigt auf die richtige Antwort. +1 –