我有一个包含几百万条记录的查询集。我需要更新一个布尔值,从根本上切换它,以便在数据库表中重置值。最快的方法是什么?
我尝试遍历查询集并更新并保存每条记录,这显然需要很长时间?我们需要快速做到这一点,有什么建议吗?
答案 0 :(得分:4)
请参阅documentation:
Entry.objects.all().update(value= not F('value'))
答案 1 :(得分:0)
实际上,这对我没用。
以下是:
Entry.objects.all().update(value=(F('value')==False))
答案 2 :(得分:0)
实际上,没有建议的解决方案起作用。我相信他们确实在某个时候工作了,但现在不再了。
问题在于Django将not F('value')
评估为False。
您可以通过在python shell中进行测试来自己尝试
not F('is_featured')
vs。
for example F('is_featured') + 1
发生这种情况是因为Django不支持否定/不支持F表达式。 Here是关于该主题的讨论:讨论了很多,但最终仍未解决问题。 8年,还在计数。
幸运的是,有一个解决方案。我找到了here。 您将必须使用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))
)
)
有时您might want to use bulk_update
而不是普通的update
。
有趣的是,bulk_update
relies的实现与我在上面提供的解决方案中完全相同的Case / When / Then / Value恶作剧。