如何记住QuerySet.update()之后要处理的对象

时间:2011-06-30 13:05:32

标签: django django-models

我想使用bar的{​​{1}}方法更新一堆Foo个对象的QuerySet属性。然后我想对修改过的对象做一些事情,但我无法使用update()属性识别它们。

不知何故,通过记住ID,它无法正常工作。

bar

old_bar = Bar.objects.get(id=1) new_bar = Bar.objects.get(id=2) foo_query = Foo.objects.filter(bar=old_bar) foo_ids = foo_query.values_list('id', flat=True) print len(foo_ids), foo_query.count(), Foo.objects.filter(id__in=foo_ids).count() # outputs "42 42 42" print foo_query.update(bar=new_bar) # outputs "42" print len(foo_ids), foo_query.count(), Foo.objects.filter(id__in=foo_ids).count() # outputs "42 0 0" 方法是否会修改ID或我做错了什么?

1 个答案:

答案 0 :(得分:1)

查询集是惰性的,因此每次使用它们时都会对它们进行评估!因此,在您的示例中,foo_query将被多次评估,并根据数据库中的实际对象返回不同的内容。因此,foo_ids不是ID列表,而是评估到列表的ValuesQueryset

强制将其评估为列表应该使您的示例正常工作,因为ID不会更改以反映数据库的实际状态:foo_ids = list(foo_query.values_list('id', flat=True))