2016-07-15 17 views
1

Ich habe das folgende Problem: Ich muss eine Reihe von Objekten mit dem gleichen many_to_many Feld aktualisieren. So können sagen, ich habe folgende Modelledjango: Bulk Update-Objekte mit ManyToMany

class Blog: 
    name = CharField 
    users = M2M(User) 

class User: 
    name = CharField 

Und jetzt so etwas wie users = Users.objects.filter(**somefilters) und Blog.objects.filter(#getting very large list of blogs).update(users=users)

Tatsächlich ist die Update-Operation versucht, nicht funktioniert, wie M2M-Objekte scheinen nicht unterstützt werden. Und wenn ich etwas Liste versuche

for blog in large_list_of_blogs: 
    blog.users.add(users) 

Es ist sehr, sehr langsam, zu tun, wie jedes Objekt einzeln zugegriffen wird.

Antwort

1

Sie können bulk_create auf dem Zwischenmodell der M2M-Beziehung verwenden.

Was ich von Ihnen sehen kann Beispiel ist, dass Sie die gleiche Gruppe von Benutzern für eine Gruppe von Blogs zuweisen möchten.

So wäre eine Beispiel-Implementierung wie folgt aussehen:

users = Users.objects.filter(**somefilters) 
blogs = Blog.objects.filter(**another_filters) 

BlogUserRelation = Blog.users.through 

relations = [] 
for blog in blogs: 
    relations.extend([BlogUserRelation(
         user_id=user.id, 
         blog_id=blog.id 
        ) for user in users]) 

BlogUserRelation.objects.bulk_create(relations) 

Dies ist effizienter in Bezug auf db-Abfragen, sondern müssen alle Objekte in den Speicher laden. Um es effizient zu machen, müssen Sie eine Art von queryset iterator verwenden und die Blog-Objekte auf Chunks durchlaufen.

Eine weitere Sache im Auge zu haben, in der Regel, wenn Sie blog.users.add(users) verwenden, django Kontrollen für bestehende user-blog Beziehungen und schließen sie, mit bulk_create dies nicht der Fall ist, und Sie werden sie tun müssen, manuell, wenn Sie benötigen.