这不是预期的行为:
items = Item.objects.filter(sent=False)
items.count() # 3
items.update(sent=True)
items.count() # 0
如何在不丢失查询集的情况下更新对象?
答案 0 :(得分:3)
每当您运行.count()
时,您正在进行另一次查询。
这是预期的行为 - 在您进行更新之前,有3个对象sent=False
,之后没有。
如果您想保留结果,则需要将其保存在变量中。
items_count = items.count()
如果您没有处理太多项目,可能的解决方法是使查询集更加清晰。
items = list(Item.objects.filter(send=False)
len(items) # 3
Item.objects.filter(send=False).update(send=True)
len(items) # 3
这当然意味着您不再能够访问queryset方法(我之所以必须使用len
而不是.count()
。这确实意味着您甚至可以使用模型更新(但您需要记住,如果您以这种方式执行此操作,则会处理过时的实例 - send
仍会设置为False
)
请记住,查询集不是模型列表。它是一个查询的表示,您可以迭代以获得结果。