我尝试一些这样的代码:
mymodels = MyModel.objects.filter(status=1)
mymodels.update(status=4)
print(mymodels)
结果是一个空列表
我知道我可以使用 for 循环来替换更新。
但它会产生很多更新查询。
无论如何在批量更新后继续操作 mymodels 吗?
我尝试一些这样的代码:
mymodels = MyModel.objects.filter(status=1)
mymodels.update(status=4)
print(mymodels)
结果是一个空列表
我知道我可以使用 for 循环来替换更新。
但它会产生很多更新查询。
无论如何在批量更新后继续操作 mymodels 吗?
QuerySet 是惰性的——创建 QuerySet 的行为不涉及任何数据库活动。您可以整天将过滤器堆叠在一起,在评估 QuerySet 之前,Django 不会实际运行查询
update() 方法是立即应用的,对更新的 QuerySet 的唯一限制是它只能更新模型主表中的列,而不是相关模型。
因此,虽然 - 在您的代码中 - 在 yourupdate
之后应用调用filter
,但实际上它是预先应用的,因此您的对象在 (懒惰) 应用status
之前被更改filter
,这意味着没有匹配的记录并且结果为空。
mymodels = MyModel.objects.filter(status=1)
objs = [obj for obj in mymodels] # save the objects you are about to update
mymodels.update(status=4)
print(objs)
应该管用。
Timmy O'Mahony 解释了原因。