Max*_*ore 3 django django-orm django-queryset
这不是预期的行为:
items = Item.objects.filter(sent=False)
items.count() # 3
items.update(sent=True)
items.count() # 0
Run Code Online (Sandbox Code Playgroud)
如何在不丢失查询集中的对象的情况下更新对象?
每当您运行时,.count()您都在进行另一个查询。
所以这是预期的行为 - 在您进行更新之前,有 3 个对象带有sent=False,之后没有。
如果要保留结果,则需要将它们保存在变量中。
items_count = items.count()
Run Code Online (Sandbox Code Playgroud)
如果您不处理太多项目,一个潜在的解决方案是列出查询集。
items = list(Item.objects.filter(send=False)
len(items) # 3
Item.objects.filter(send=False).update(send=True)
len(items) # 3
Run Code Online (Sandbox Code Playgroud)
这当然意味着您不再可以访问 queryset 方法(这就是我为什么必须使用len而不是.count(). 这确实意味着即使在更新之后您也可以使用模型(但您需要记住您正在处理过时的实例,如果你这样做 -send仍将设置为False)
请记住,查询集不是模型列表。它是您可以迭代以获取结果的查询的表示。