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

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

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

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

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

【问题讨论】:

    标签: python django django-queryset


    【解决方案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 - 否则,非常有帮助,谢谢。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 2013-07-04
    • 1970-01-01
    • 2012-01-26
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多