Django 查询集更新方法从查询集中删除对象

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)

如何在不丢失查询集中的对象的情况下更新对象?

Sha*_*dow 5

每当您运行时,.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)

请记住,查询集不是模型列表。它是您可以迭代以获取结果的查询的表示。