创建如果不存在

use*_*786 71 django models

我有一个Django应用程序,它从Web API读取数据并将其放入数据库中.
有没有办法从模式创建新对象,但如果对象已存在,则防止重复异常?

换句话说,有没有办法保存一个对象,但只要它已经存在就什么都不做?

sec*_*ond 137

Model.objects.get_or_create()

  • 使它成为文档的链接添加一些字符(并使其成为一个更好的答案,我猜) (9认同)
  • 这似乎使2个查询.如果我只想保存对象以防它不存在,有没有办法只有1个查询?我想捕捉`IntegrityError`导致当前事务中止并且还不够. (4认同)

Ben*_*hon 44

在Django 1.7中,您还可以:

Model.objects.update_or_create()

  • 我真的可以在1.6中使用它. (3认同)

Abh*_*ngh 6

它可以通过使用来实现Model.objects.get_or_create()

\n

例子

\n
obj, created = Person.objects.get_or_create(\n    first_name=\'John\',\n    last_name=\'Lennon\',\n    defaults={\'birthday\': date(1940, 10, 9)},\n)\n
Run Code Online (Sandbox Code Playgroud)\n

传递给 get_or_create() \xe2\x80\x94 的任何关键字参数(此处为first_namelast_name )除了名为defaults \xe2\x80\x94 的可选参数外,都将用于在数据库中查询(查找对象)。

\n

它返回一个元组,如果找到一个对象,get_or_create() 返回该对象的元组和 False。

\n

注意try except:使用语句也可以实现同样的效果
\n示例:

\n
try:\n    obj = Person.objects.get(first_name=\'John\', last_name=\'Lennon\')\nexcept Person.DoesNotExist:\n    obj = Person(first_name=\'John\', last_name=\'Lennon\', birthday=date(1940, 10, 9))\n    obj.save()\n
Run Code Online (Sandbox Code Playgroud)\n