TypeError: ‘DoesNotExist’对象不可调用

18 投票
1 回答
4498 浏览
提问于 2025-04-17 04:54

这段代码不是每次都会出问题,但这是最近的一次。看起来是随机发生的,有什么想法吗?

try:
    u = User.objects.get(email__iexact=useremail)
except User.DoesNotExist:
    ...

这个错误会随机出现。

File "/srv/myapp/registration/models.py", line 23, in get_or_create_user
  u = User.objects.get(email__iexact=useremail)

File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py", line 132, in get
  return self.get_query_set().get(*args, **kwargs)

File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 349, in get
  % self.model._meta.object_name)

TypeError: ‘DoesNotExist’ object is not callable

1 个回答

43

正如Chris在上面的评论中提到的,你的代码片段是有效的。不过在你代码的其他地方,可能有地方处理异常的方式不太对。

你可能写成了这样:

try:
    do_something()
except User.MultipleObjectsReturned, User.DoesNotExist:
    pass

而不是:

try:
    do_something()
except (User.MultipleObjectsReturned, User.DoesNotExist):
    pass

如果没有括号,except语句在Python 2.6及以上版本中就等同于下面的写法:

except User.MultipleObjectsReturned as User.DoesNotExist:

User.MultipleObjectsReturned这个异常的实例会覆盖掉User.DoesNotExist

当同一个过程在后面处理不同的请求时,你会遇到TypeError,因为你的代码试图调用那个已经替代了User.DoesNotExist的异常实例。

撰写回答