Django queryset update方法从queryset中删除对象

时间:2017-03-20 23:38:09

标签: django django-queryset django-orm

这不是预期的行为:

items = Item.objects.filter(sent=False)

items.count() # 3

items.update(sent=True)

items.count() # 0

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

1 个答案:

答案 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

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