我有一個包含大約 10,000 多行資料的 5 列模型。現在我想根據其他列值更新所有行中的一列。
uj5u.com熱心網友回復:
在我看來,對于您的場景“我想根據其他列值更新所有行中的一列”。,最好的選擇是使用條件更新
讓我們假設這個模型:
class Person(models.Model):
f1 = models.IntegerField()
f2 = models.IntegerField()
f3 = models.IntegerField()
f4 = models.IntegerField()
您可以通過以下方式更新它:
rom django.db.models import F, When, Case
new_value = Case(
When(f1__gte=F('f2'), then=F('f1')),
default=F('f2')
)
Person.objects.update(f3=new_value)
這引發了一個簡單的更新 sql 陳述句:
>>> import logging
>>> l = logging.getLogger('django.db.backends')
>>> l.setLevel(logging.DEBUG)
>>> l.addHandler(logging.StreamHandler())
>>> Person.objects.update(f3=c)
(0.000) UPDATE "tt_person" SET "f3" = CASE WHEN ("tt_person"."f1" >= "tt_person"."f2") THEN "tt_person"."f1" ELSE "tt_person"."f2" END; args=()
0
uj5u.com熱心網友回復:
進行批量更新的開箱即用 django 功能是bulk_update()。這里有一個例子:
myModel = MyModel.objects.all()
for l in myModel:
if c1=='ChkVal1' and c2 < c3:
c4='Value 1'
elif c1=='ChkVal2' and c2 b> c3:
c4='Value 2'
else
c4='Value 3'
MyModel.objects.bulk_update(myModel, update_fields = ['c4'])
請記住,參考檔案:
- 您無法更新模型的主鍵。
- 不會呼叫每個模型的 save() 方法,也不會發送 pre_save 和 post_save 信號。
- 如果更新大量行中的大量列,則生成的 SQL 可能非常大。通過指定合適的 batch_size 來避免這種情況。
- 更新在多表繼承祖先上定義的欄位將導致每個祖先的額外查詢。
- 當單個批次包含重復項時,只有該批次中的第一個實體會導致更新。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370655.html
標籤:姜戈
上一篇:DjangoRESTFrameworkSerializer:無法匯入模型
下一篇:用Css改變背景
