批量更新查詢集

假設我們想要從 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 來完成工作,資料庫經過精心調整以進行此類查詢。
  • 有效減少實現所需結果所需的資料庫查詢數量。