Django get_or_create与捕获IntegrityError

时间:2014-05-07 13:07:02

标签: django django-orm

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

  1. 始终插入行(通过调用模型的save方法)并捕获潜在的IntegrityError例外
  2. get_or_create
  3. 调用QuerySet方法

1 个答案:

答案 0 :(得分:2)

想想你在做什么:你想在数据库中插入行,如果它存在,你不需要从中获取对象。 Ask for forgiveness,并抓住IntegrityError例外:

try:
    user = User(username=username)
    user.save()
except IntegrityError:
    print "Duplicate user"

这样可以避免get_or_create()进行额外get()次查询的开销。

仅供参考,EAFP是Python中常见的练习/编码风格:

  

比获得许可更容易请求宽恕。这个常见的Python   编码风格假定存在有效的键或属性   如果假设被证明是假的,则捕获异常。这干净又快   风格的特点是存在许多尝试和除外   语句。

另见:https://stackoverflow.com/questions/6092992/why-is-it-easier-to-ask-forgiveness-than-permission-in-python-but-not-in-java