gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:24:54 25 4
gpt4 key购买 nike

我想更新bar一堆Foo的属性使用 QuerySet 的对象的update()方法。然后我想对修改后的对象执行一些操作,但我无法再使用bar来识别它们属性。

不知何故,记住 id 是行不通的。

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"

update() 是吗?方法修改id还是我做错了什么?

最佳答案

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

强制它计算为列表应该会使您的示例正常工作,因为 ids 不会更改以反射(reflect)数据库的实际状态: foo_ids = list(foo_query.values_list('id', flat=True)) .

关于django - 如何记住 QuerySet.update() 之后要处理的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6535190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com