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

Posted

技术标签:

【中文标题】Django:更改查询集中所有对象的字段值【英文标题】:Django: change the value of a field for all objects in a queryset 【发布时间】:2016-04-22 08:11:48 【问题描述】:

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

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

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

如何为这个qs中的所有对象设置active=False

【问题讨论】:

【参考方案1】:

你可以更新查询集中的所有记录

qs.update(active=False)

更多信息请参考官方Django documentation

【讨论】:

需要注意的是,qs.update() 将不会调用模型的保存函数。当然,这很明显;但是,对于在保存期间依赖代码执行的开发人员,他们需要注意这一点!【参考方案2】:

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

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 个单独的查询中完成。我在我的一个项目中遇到过这种要求。希望对您有所帮助。

【讨论】:

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

以上是关于Django:更改查询集中所有对象的字段值的主要内容,如果未能解决你的问题,请参考以下文章

即使数据库将 0 存储为字段值,Django 查询集对象也返回 None 而不是 0

Django Newbie - 使用多字段表单,如何消除查询集中的空字段

在 django 的查询集中获取对象的计数

如何从 Django ModelChoiceField 查询集中选择值和标签

Django框架:模型 字段查询查询集

从 django 的查询集中获取第一个对象的最快方法?