使用Django 1.9,我有一些代码在同一个函数的同一个表上进行两个选择查询。代码如下所示:
foo_ids = [1] # A list of (actually uuids)
foo_qs = Foo.objects.filter(id__in=foo_ids, bar=False)
此时,如果我在代码中打印了查询集,它将显示至少一个项目:
print foo_qs # [<Foo: Foo(id='1', ...)]
因此,我在此查询集上执行update()
,修改bar
,但不修改id
。
rows_updated = foo_qs.update(bar=True) # 1 updated
此时,print foo_qs
将产生[]
。由于不再符合bar=False
,因此可以预期。但是,如果我现在在代码下创建一个新的查询集,那么该文件看起来类似于:
foo_ids = [1]
foo_qs = Foo.objects.filter(id__in=foo_ids, bar=False)
rows_updated = foo_qs.update(bar=True)
new_foo_qs = Foo.objects.filter(id__in=foo_ids) # Should contain 1 record
尽管记录在数据库中,new_foo_qs
也没有任何内容!
这可以通过首先将foo_ids
转换为集合来解决,就像这样。
foo_ids = [1]
foo_qs = Foo.objects.filter(id__in=foo_ids, bar=False)
rows_updated = foo_qs.update(bar=True)
foo_ids = set(foo_ids)
new_foo_qs = Foo.objects.filter(id__in=foo_ids) # 1 record
为什么会这样?这是我需要了解的一些缓存机制吗?