我有以下问题:我需要使用相同的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)
它非常慢,因为每个对象都是单独访问的。
答案 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并非如此,您将拥有如果需要,可以手动完成。