簡體   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