2016-07-15 115 views
1

我遇到以下问题:我需要使用相同的many_to_many字段更新一组对象。因此,可以说,我有以下型号django:使用ManyToMany批量更新对象

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

class User: 
    name = CharField 

现在试图像 users = Users.objects.filter(**somefilters)Blog.objects.filter(#getting very large list of blogs).update(users=users)

其实更新操作不起作用,因为似乎M2M对象不被支持。 如果我试图做一些事情列表

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

这是非常非常慢,因为每个对象单独访问。

回答

1

您可以做的是在M2M关系的中间模型上使用bulk_create

我能从你身上看到的例子是,你想为一组博客分配同一组用户。

因此,一个示例实现会是什么样子:

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) 

这是数据库查询方面效率很高,但需要将所有对象加载到内存中。为了提高内存效率,您需要使用某种queryset iterator并遍历块上的博客对象。

一两件事心里有,通常当你使用blog.users.add(users)django检查现有user-blog关系和排斥他们,bulk_create不是这种情况下,你将不得不如果你需要做手工。