Django:使用ManyToMany批量更新对象

4

我有一个问题:我需要更新一组具有相同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个回答

2
您可以在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迭代器并以块的方式遍历博客对象。
还有一件事要记住,通常当您使用blog.users.add(users)时,django会检查现有的user-blog关系并将其排除在外。但使用bulk_create则不是这种情况,如果需要,您将不得不手动执行此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接