【发布时间】:2012-02-04 16:15:40
【问题描述】:
我有一个 Django 应用程序,它从 Web API 读取数据并将其放入数据库中。
有没有办法从模式创建新对象但如果对象已经存在则防止重复异常?
换句话说,有没有办法保存一个对象,但如果它已经存在则什么都不做?
【问题讨论】:
我有一个 Django 应用程序,它从 Web API 读取数据并将其放入数据库中。
有没有办法从模式创建新对象但如果对象已经存在则防止重复异常?
换句话说,有没有办法保存一个对象,但如果它已经存在则什么都不做?
【问题讨论】:
【讨论】:
IntegrityError 会导致当前事务中止并且还不够。
transaction.atomic(确保你在atomic块的外部捕获,即try: with acomic: create; except IntegrityError。确保你没有捕获其他完整性错误也很棘手你打算的那个
IntegrityError,我的测试表明,与get_or_create()相比,当记录存在时,它的执行时间几乎减少了一半。
在 Django 1.7 中,你也可以这样做:
【讨论】:
看起来在较新版本的 Django 中,save() 函数默认执行 UPDATE 或 INSERT。见here。
【讨论】:
可以使用Model.objects.get_or_create()实现
示例
obj, created = Person.objects.get_or_create(
first_name='John',
last_name='Lennon',
defaults={'birthday': date(1940, 10, 9)},
)
传递给 get_or_create() 的任何关键字参数(此处为 first_name 和 last_name)——除了一个名为 defaults 的可选参数——将用于在数据库中查询(查找对象)。
它返回一个元组,如果找到一个对象,get_or_create() 返回该对象的一个元组,返回False。
注意:同样的事情也可以使用try except 语句实现
示例:
try:
obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
obj.save()
【讨论】: