當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python Django QuerySet.update_or_create用法及代碼示例


本文介紹 django.db.models.query.QuerySet.update_or_create 的用法。

聲明

update_or_create(defaults=None, **kwargs)

一種使用給定 kwargs 更新對象的便捷方法,必要時創建一個新對象。 defaults 是用於更新對象的(字段、值)對的字典。 defaults 中的值可以是可調用的。

返回 (object, created) 的元組,其中 object 是創建或更新的對象, created 是指定是否創建新對象的布爾值。

update_or_create 方法嘗試根據給定的 kwargs 從數據庫中獲取對象。如果找到匹配項,它會更新 defaults 字典中傳遞的字段。

這意味著作為樣板代碼的快捷方式。例如:

defaults = {'first_name': 'Bob'}
try:
    obj = Person.objects.get(first_name='John', last_name='Lennon')
    for key, value in defaults.items():
        setattr(obj, key, value)
    obj.save()
except Person.DoesNotExist:
    new_values = {'first_name': 'John', 'last_name': 'Lennon'}
    new_values.update(defaults)
    obj = Person(**new_values)
    obj.save()

隨著模型中字段數量的增加,這種模式變得非常笨拙。上麵的示例可以使用update_or_create() 重寫,如下所示:

obj, created = Person.objects.update_or_create(
    first_name='John', last_name='Lennon',
    defaults={'first_name': 'Bob'},
)

有關如何解析 kwargs 中傳遞的名稱的詳細說明,請參閱 get_or_create()

如上麵 get_or_create() 中所述,如果在數據庫級別未強製執行唯一性,則此方法容易產生 race-condition,這可能導致同時插入多行。

get_or_create() create() 一樣,如果您使用手動指定的主鍵並且需要創建一個對象但該鍵已存在於數據庫中,則會引發 IntegrityError

相關用法


注:本文由純淨天空篩選整理自djangoproject.com大神的英文原創作品 django.db.models.query.QuerySet.update_or_create。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。