当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。