Django model.DoesNotExist异常以某种方式替换为AttributeError

时间:2014-11-27 16:09:16

标签: python django django-models

我在Django 1.5网站上遇到奇怪的异常:

 "TypeError: 'exceptions.AttributeError' object is not callable"

基本上看起来模型.DoesNotExist异常已被AttributeError替换。

错误是间歇性的,但一旦发生,它似乎会“坚持”。直到我重新启动这个过程,这让我觉得可能是模型类在特定请求过程中被错误设置,然后持续存在的情况。

追溯底部:

File "/opt/mysite/django/apps/profiles/models.py", line 353, in profile_from_cache
    profile = self.get(user=user_id)

  File "/opt/mysite/.virtualenvs/django/lib/python2.7/site-packages/django/db/models/manager.py", line 143, in get
    return self.get_query_set().get(*args, **kwargs)

  File "/opt/mysite/.virtualenvs/django/lib/python2.7/site-packages/django/db/models/query.py", line 404, in get
    self.model._meta.object_name)

TypeError: 'exceptions.AttributeError' object is not callable

来自django/db/models/query.py的代码行:

if not num:
    raise self.model.DoesNotExist(
        "%s matching query does not exist." %
        self.model._meta.object_name)

所以看起来好像它试图将消息传递给模型上的DoesNotExist异常,但它已被某种方式替换为AttributeError。

问题似乎只发生在http请求中 - 如果我从命令行执行相同的操作,我只会得到一个DoNotExist异常(应该发生的事情)。

我无法找到任何明显的原因。有什么想法吗?

(PS这似乎是同一个问题。我认为,用户对它的回答是错误的:https://groups.google.com/forum/#!topic/django-users/k9JMyXlUt3Q

可能相关的代码

以下是模型经理的概要:

class CacheManager(models.Manager):
    def profile_from_cache(self, user_id=None):
        profile = cache.get("profile_%s" % user_id)
        if profile is None:
            try:
                profile = self.get(user=user_id)
            except Profile.DoesNotExist:
                return None
            cache.set("profile_%s" % user_id, profile, settings.CACHE_TIMEOUT)
        return profile

    ...

class Profile(models.Model):
    ...
    caches = CacheManager()

这里是导致错误的代码行。在这种情况下,它存在于一些中间件中,但是有一些不同的地方,都会导致同样的事情。

Profile.caches.profile_from_cache(user_id=request.user.pk)

1 个答案:

答案 0 :(得分:2)

由于项目中其他地方的语法不正确,因此遇到了多个例外情况:

try:
   do_something()
except AttributeError, Profile.DoesNotExist:
   pass

应该是这样的:

try:
   do_something()
except (AttributeError, Profile.DoesNotExist):
   pass

发生的事情是,当发生这种情况时,AttributeError被分配到内存中的Profile.DoesNotExist,所以当它稍后被提出时,这是错误的异常。

感谢this post提供帮助。