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 - 使用多字段表单,如何消除查询集中的空字段