我有一个包含几百万条记录的查询集。我需要更新一个布尔值,从根本上切换它,以便在数据库表中重置值。最快的方法是什么?
我尝试遍历查询集并更新和保存每条记录,这显然需要很长时间?我们需要非常快地做到这一点,有什么建议吗?
我有一个包含几百万条记录的查询集。我需要更新一个布尔值,从根本上切换它,以便在数据库表中重置值。最快的方法是什么?
我尝试遍历查询集并更新和保存每条记录,这显然需要很长时间?我们需要非常快地做到这一点,有什么建议吗?
请参阅文档:
Entry.objects.all().update(value= not F('value'))
实际上,这对我来说并不奏效。
以下做了:
Entry.objects.all().update(value=(F('value')==False))
实际上,建议的解决方案都没有奏效。我相信他们在某个时候确实有效,但现在不再有效。
问题是 Django 评估not F('value')
为 False。您可以通过在 python shell 中进行测试来自己尝试
not F('is_featured')
对比
for example F('is_featured') + 1
发生这种情况是因为 Django 不支持 F 表达式中的否定/非。这是关于该主题的讨论:讨论了很多,但最终问题仍未解决。8 年而且还在继续。
幸运的是,有一个解决方案。我在这里找到了。您将不得不使用Case When
from django.db.models import Case, Value, When
Item.objects.filter(serial__in=license_ids
).update(renewable=Case(
When(renewable=True, then=Value(False)),
default=Value(True))
)
)
有时你可能想用 bulk_update
普通的update
.
有趣的是, 的实现bulk_update
依赖于与我上面提供的解决方案完全相同的 Case/When/Then/Value 恶作剧。