![](/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.