【问题标题】:django: Bulk update objects with ManyToManydjango:使用 ManyToMany 批量更新对象
【发布时间】:2016-11-18 22:42:22
【问题描述】:

我有以下问题:我需要更新一组具有相同 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)

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

【问题讨论】:

    标签: python django


    【解决方案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 时情况并非如此,如果您需要手动执行需要。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 2016-04-29
      相关资源
      最近更新 更多