在python / django orm中正确使用异常

时间:2013-12-08 12:19:47

标签: python django

我正在尝试获取一个对象,如果它存在就好,如果没有那么其他等等。执行以下操作是否正确?我听说异常是昂贵的,避免避免,这是正确的吗?

try:
   user = User.objects.get(user=id)
except ObjectDoesNotExist:
   try:
       user = User.objects.get(email=id)
   except ObjectDoesNotExist:
       try:
        # ...

finally:
    # do the final thing

2 个答案:

答案 0 :(得分:1)

它们有点贵,但在需要时使用肯定不会太昂贵。我更关心用多个查询来锤击数据库你可以通过在一个查询中获取所有可能字段的结果来避免这两个问题。

from django.contrib.auth.models import User
from django.db.models import Q
user = User.objects.filter(Q(user=id) | Q(email=id) | [...])[0]

这依赖于django的Q-objects,它允许您以比构建过滤器时通常获得的常用AND连接更复杂的方式创建连接在一起的条件。如果您不关心将多个对象恢复的可能性,您仍然可以像在示例中一样使用get()方法。

答案 1 :(得分:1)

此处解释了try / except的费用:cost-of-exception-handlers-in-python

我建议抓住那些不应该发生的事情,或者只是很少发生(真正的例外),尝试/除了更常见的条件情况。 特别是在像Model.objects.get()这样的情况下,底层sql返回一个空列表,如果被称为过滤器,则不会引发异常。

users = User.objects.filter(user=id)[:1]
user = users and users[0]