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

43T*_*cts 36 python django django-queryset

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

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

qs = MyModel.Objects.filter(....) 
Run Code Online (Sandbox Code Playgroud)

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

Pyn*_*hia 63

您可以使用更新查询集中的所有记录

qs.update(active=False)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅官方Django文档

  • 应当注意,qs.update()不会*调用模型的保存函数。当然,这很明显。但是,对于在保存期间依赖代码执行的开发人员,他们将需要意识到这一点! (5认同)

Mic*_*ura 8

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

qs.update(active=False, is_deleted=True, date_finished=timezone.now())
Run Code Online (Sandbox Code Playgroud)

编辑:另外。这个简单的 qs.update(...) 不适用于切片查询集。例如,如果您有:

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

在这种情况下,从 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"])
Run Code Online (Sandbox Code Playgroud)

这通常会在一个查询中完成,而不是在 10 个单独的查询中完成。我在我的一个项目中遇到过这种要求。希望它会有所帮助。

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