Django:更改查询集中所有对象的字段值

88

我有一个模型MyModel,它有一个布尔字段active

在其他地方,我正在检索一个查询集:

qs = MyModel.Objects.filter(....) 

我该如何在这个qs中将所有对象的active设为False

2个回答

144

你可以使用以下方式更新queryset中的所有记录:

qs.update(active=False)
请参阅官方Django文档以获得更多信息。

29
需要注意的是,qs.update() 不会调用模型的保存函数。虽然这很显而易见,但对于依赖保存期间执行代码的开发人员来说,他们需要注意这一点! - rgenito

8

当然,你可以传递许多参数来更新,例如:

qs.update(active=False, is_deleted=True, date_finished=timezone.now())

编辑: 此外,仅使用qs.update(...)无法在切片查询集上起作用。例如,如果您有:

users = User.objects.filter(is_active=True)[:10]
user.update(is_active=False)  # This will throw error

在这种情况下,自 Django 2.2 以来,您可以使用 bulk_update() 方法,示例如下:

users_to_update = list(User.objects.filter(is_active=True)[:10])
for i in range(10):
    users_to_update.is_active = False

User.objects.bulk_update(users_to_update, ["is_active"])

这通常会在一个查询中完成,而不是10个单独的查询。我曾在我的一个项目中面对过这种需求。希望这对你有所帮助。

2
users_to_update[i].is_active = False - 否则非常有帮助,谢谢 :) - willer2k

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