我想使用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或我做错了什么?
答案 0 :(得分:1)
查询集是惰性的,因此每次使用它们时都会对它们进行评估!因此,在您的示例中,foo_query
将被多次评估,并根据数据库中的实际对象返回不同的内容。因此,foo_ids
不是ID列表,而是评估到列表的ValuesQueryset
。
强制将其评估为列表应该使您的示例正常工作,因为ID不会更改以反映数据库的实际状态:foo_ids = list(foo_query.values_list('id', flat=True))
。