最快的方法来更新Django中queryset中的一堆记录

时间:2010-01-26 18:50:51

标签: python database django django-queryset

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

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

3 个答案:

答案 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恶作剧。