批量更新查询集

假设我们想要从 id 51 的作者的所有文章中删除 2 个 upvotes。
仅使用 Python 执行此操作将执行 N 查询(N 是查询集中的文章数):

for article in Article.objects.filter(author_id=51):
    article.upvotes -= 2
    article.save()
    # Note that there is a race condition here but this is not the focus
    # of this example.

如果不是将所有文章都引入 Python,循环遍历它们,减少 upvotes,并将每个更新的文章保存回数据库,还有另一种方法吗?
使用 F() 表达式,可以在一个查询中执行:

Article.objects.filter(author_id=51).update(upvotes=F('upvotes') - 2)

哪个可以在以下 SQL 查询中翻译:

UPDATE app_article SET upvotes = upvotes - 2 WHERE author_id = 51

为什么这样更好?

  • 我们将负载传递到数据库中,而不是使用 Python 来完成工作,数据库经过精心调整以进行此类查询。
  • 有效减少实现所需结果所需的数据库查询数量。