在 Django 中批量更新(使用唯一值)的方法

Esc*_*her 1 python django sql-update

假设我有一个包含电子邮件和生日的听写列表:

p = [\
    {'email': 'someone@somewhere.com', 'birthday': '1990-01-01'},
    {'email': 'someone_else@somewhereelse.com', 'birthday': '1980-02-05'},
    #...etc
]
Run Code Online (Sandbox Code Playgroud)

我想更新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
Run Code Online (Sandbox Code Playgroud)

我对 Django 的经验还不够,不知道这是否是一个好的实践。表达我想做的事情最Pythonic的方式是什么?

xtr*_*ist 6

使用 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)
Run Code Online (Sandbox Code Playgroud)