如果不存在则创建


80

我有一个Django应用程序,该应用程序从Web API读取数据并将其放入数据库中。
有没有一种方法可以从某个模式创建新对象,但是如果该对象已经存在,则可以防止重复异常?

换句话说,有没有一种方法可以保存对象,但是如果对象已经存在,则什么也不做?

Answers:


154

9
使它成为文档的链接会增加一些字符(我想这是一个更好的答案)
2

4
这似乎使2查询。如果我只想保存该对象不存在的对象,是否只有一种查询方式?我想捕获IntegrityError会导致当前事务中止并且这还不够。
阿米尔·阿里·阿克巴里

如果添加一个保存点,则可以捕获到完整性错误,例如使用transaction.atomic(确保在块捕获atomic,即try: with acomic: create; except IntegrityError。确保您没有捕获到其他完整性错误也并非易事,这很棘手
第二个

如果您能够抓住IntegrityError,我的测试表明,与相比,该记录将执行时间缩短了近一半get_or_create()
罗恩


2

看起来在较新版本的Django中,save()函数默认情况下执行UPDATE或INSERT。看这里


看起来它应该会自动选择得很好,但是在我的数据库中,每次我运行脚本来填充数据库时,当前都在复制条目。
马丁马丁

save()方法检查模型的PK是否具有值。为了使用此技术,作者必须查询数据库才能获得具有正确PK的模型实例。单独使用save()并不能解决问题。
cockahoona
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.