Python Django中批量更新(具有唯一值)的方法

Python Django中批量更新(具有唯一值)的方法,python,django,sql-update,Python,Django,Sql Update,比如说,我有一份包含电子邮件和生日的口述清单: 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.

比如说,我有一份包含电子邮件和生日的口述清单:

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的经验还不够丰富,不知道这是否是一种好的做法。用什么最符合python的方式来表达我的想法?

过滤和更新时,相同的更新将应用于所有过滤的条目。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

筛选和更新时,相同的更新将应用于所有筛选的条目。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
有一个库:

有一个库:


使用Django的
批量更新
-

objs=[]
对于p中的人员:
obj=People.objects.get(email=person['email'])
obj.birth=人['birth']
objs.append(obj)
People.objects.bulk_更新(objs,['birth'],批量大小=1000)

使用Django的
批量更新
-

objs=[]
对于p中的人员:
obj=People.objects.get(email=person['email'])
obj.birth=人['birth']
objs.append(obj)
People.objects.bulk_更新(objs,['birth'],批量大小=1000)

数据库中是否已经存在所有这些电子邮件ID?在
People
表中是否会有多个条目用于相同的电子邮件id?我想检查更新是一个很好的做法,但不应该有重复项;这已在插入时验证。在上面的代码中,任何拥有相同电子邮件的
人都会获得相同的生日。为了获得更好的代码,您可以在For循环之外使用transaction.atomic()编写
。数据库中是否已经存在所有这些电子邮件ID?在
People
表中是否会有多个条目用于相同的电子邮件id?我想检查更新是一个很好的做法,但不应该有重复项;这已在插入时验证。在上面的代码中,任何拥有相同电子邮件的
人都会获得相同的生日。为了获得更好的代码,您可以在For循环之外使用transaction.atomic()编写
。请注意,此答案现在已过时。Django 2.2及更高版本本机支持bulk_update()方法,类似于Django bulk update提供的方法,不需要任何第三方库。请注意,此答案现在已经过时。Django 2.2及以上版本本机支持bulk_update()方法,类似于Django bulk update提供的方法,不需要任何第三方库。