1

我尝试一些这样的代码:

mymodels = MyModel.objects.filter(status=1)
mymodels.update(status=4)
print(mymodels)

结果是一个空列表

我知道我可以使用 for 循环来替换更新。

但它会产生很多更新查询。

无论如何在批量更新后继续操作 mymodels 吗?

4

2 回答 2

3

请记住Django 的 QuerySets 是惰性的

QuerySet 是惰性的——创建 QuerySet 的行为不涉及任何数据库活动。您可以整天将过滤器堆叠在一起,在评估 QuerySet 之前,Django 不会实际运行查询

但是方法功能实际上是立即应用update()

update() 方法是立即应用的,对更新的 QuerySet 的唯一限制是它只能更新模型主表中的列,而不是相关模型。

因此,虽然 - 在您的代码中 - 在 yourupdate之后应用调用filter,但实际上它是预先应用的,因此您的对象在 (懒惰) 应用status之前被更改filter,这意味着没有匹配的记录并且结果为空。

于 2013-05-21T12:48:11.377 回答
2
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 解释了原因。

于 2013-05-21T13:30:50.943 回答