django:使用ManyToMany批量更新对象

时间:2016-07-15 16:22:02

标签: python django

我有以下问题:我需要使用相同的many_to_many字段更新一组对象。所以我要说我有以下模型

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 个答案:

答案 0 :(得分:3)

您可以做的是在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并非如此,您将拥有如果需要,可以手动完成。