Django get_or_create 与捕获 IntegrityError

Edu*_*uca 6 django django-orm

我想User在数据库中插入几行。我并不关心插入是否成功,只要我收到通知即可,在这两种情况下我都可以做到这一点,那么哪一种在性能方面更好(主要是速度)?

  1. 始终插入行(通过调用模型的save方法)并捕获潜在的IntegrityError异常
  2. get_or_createQuerySet类中调用方法

ale*_*cxe 4

想想你在做什么:你想将行插入数据库,如果对象存在的话,你不需要从中取出对象。Ask for forgiveness,并捕获IntegrityError异常:

try:
    user = User(username=username)
    user.save()
except IntegrityError:
    print "Duplicate user"
Run Code Online (Sandbox Code Playgroud)

这样您就可以避免 进行额外get()查找的开销get_or_create()

仅供参考,EAFP这是 Python 中的常见做法/编码风格:

请求原谅比请求许可更容易。这种常见的 Python 编码风格假设存在有效的键或属性,并在假设证明错误时捕获异常。这种干净、快速的风格的特点是存在许多 try 和 except 语句。

另请参阅:/sf/ask/426509471/