您當前的位置:首頁 > 遊戲

Django中如何批次更新?

作者:由 AI不愛 發表于 遊戲時間:2022-01-13

Django中如何批次更新?小象2022-01-13 19:24:42

在 Django 中,預設情況下,每個模型都有一個物件管理器。這個管理器可以做很多事情,比如獲取模型例項、過濾模型例項、刪除模型例項。我們甚至可以透過繼承 Django 提供的基礎管理器來建立我們自己的管理器。

現在,我們應用的每個查詢,例如使用 get() 函式檢索單個模型例項或使用 filter() 方法過濾例項,都會命中資料庫一次。這意味著,如果我們有如下 5 個 get() 語句,資料庫將被單獨查詢 5 次。

person = Person。objects。get(id = 1)

person = Person。objects。get(id = 2)

person = Person。objects。get(id = 3)

person = Person。objects。get(id = 4)

person = Person。objects。get(id = 5)

這是一種低效的方法,因為我們正在為單個任務單獨訪問資料庫。如果我們必須為某些模型查詢多個例項或更新多個例項,這種方法會顯著降低我們的應用程式的速度。

為了解決這個問題,Django 有一個內建函式,通常可以用於在一個查詢中更新多個例項。

bulk_update() Django 中的方法

bulk_update 方法具有三個引數,即 objs、fields 和 batch_size。

objs - 要執行的操作列表

fields - 必須執行查詢的欄位列表

batch_size - 要在單個數據庫查詢中儲存的物件數。它是一個可選引數。預設情況下,更新並儲存所有物件。

考慮一個例子。假設我們有一個 Person 模型,我們必須使用 bulk_update() 方法將所有人員的年齡增加 1。我們會做以下事情。

在 models。py 中:

from django。db import models

class Person(models。Model):

username = models。CharField(max_length = 200, unique = True)

firstName = models。CharField(max_length = 200)

middleName = models。CharField(max_length = 200)

lastName = models。CharField(max_length = 200)

age = models。IntegerField(default = 0)

在 views。py 中:

people

=

Person

objects

all

()

for

person

in

people

person

age

+=

1

Person

objects

bulk_update

people

update_fields

=

‘age’

])

此操作將在單個查詢中更新所有人員的年齡,這是非常有效的。

bulk_update() 方法的缺點

bulk_update() 方法非常好,但並非所有的閃光點都是金子。這種方法有一些缺點。

使用 bulk_update() 方法,我們無法更新例項的主鍵。

每個模型都有一個 save() 方法。使用 bulk_update() 方法時不會呼叫此方法。

如果我們要為大量記錄更新許多列,則必須提及批次大小。否則,生成的 SQL 查詢會很長。

多動手,多練習,多理解,加油!!!

想要了解更多相關知識可以看看我別的回答喲

Django問題集錦

模型中 On_delete 引數的作用?

Django 模型中的元類如何理解?

覺得不錯的話,記得幫我@小象點個贊喲,祝大家都能學有所獲!

標簽: UPDATE  person  bulk  get  objects