7

我有一个包含几百万条记录的查询集。我需要更新一个布尔值,从根本上切换它,以便在数据库表中重置值。最快的方法是什么?

我尝试遍历查询集并更新和保存每条记录,这显然需要很长时间?我们需要非常快地做到这一点,有什么建议吗?

4

3 回答 3

6

请参阅文档

Entry.objects.all().update(value= not F('value'))
于 2010-01-26T18:53:56.510 回答
0

实际上,这对我来说并不奏效。

以下做了:

Entry.objects.all().update(value=(F('value')==False))

于 2010-11-19T22:49:31.553 回答
0

实际上,建议的解决方案都没有奏效。我相信他们在某个时候确实有效,但现在不再有效。

问题是 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 恶作剧。

于 2019-08-12T14:28:28.807 回答