![](/img/trans.png)
[英]Best way to bulk update query with dynamic values conditionally in Django
[英]Way to bulk update (with unique values) in Django
假設我有一個包含電子郵件和生日的字典列表:
p = [\
{'email': 'someone@somewhere.com', 'birthday': '1990-01-01'},
{'email': 'someone_else@somewhereelse.com', 'birthday': '1980-02-05'},
#...etc
]
我想更新數據庫中的People
對象。 原始 sql 通常有與len(p)
一樣多的查詢,所以這讓我想到這樣做:
from django.db import IntegrityError, transaction
for person in p:
try:
with transaction.atomic():
People.objects.filter(email=person['email']).update(birthday=person['birthday'])
except IntegrityError:
#handle the exception
我對 Django 的經驗不足,不知道這是否是一個好習慣。 表達我想要做的事情的最pythonic方式是什么?
使用 Django 的bulk_update
- https://docs.djangoproject.com/en/3.1/ref/models/querysets/#bulk-update
objs = []
for person in p:
obj = People.objects.get(email=person['email'])
obj.birthday = person['birthday']
objs.append(obj)
People.objects.bulk_update(objs, ['birthday'], batch_size=1000)
有一個庫: django-bulk-update 。
people = Person.objects.all()
for person in people:
person.name = random.choice(random_names)
bulk_update(people, update_fields=['name'])
# or
Person.objects.bulk_update(people, update_fields=['name'])
當您過濾和更新時,相同的更新將應用於所有過濾的條目。 Django 不提供批量更新操作,您可以在其中更新不同條目的不同值。
您可以通過在transaction.atomic()
塊中包含for
循環而不是為 for 循環中的每個條目包含原子塊來使代碼更好:
with transaction.atomic():
for person in p:
try:
People.objects.filter(email=person['email']).update(birthday=person['birthday'])
except IntegrityError:
#handle the exception
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.