批量更新查询集
假设我们想要从 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 来完成工作,数据库经过精心调整以进行此类查询。
- 有效减少实现所需结果所需的数据库查询数量。