繁体   English   中英

在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM