Ошибка типа: объект ‘DoesNotExist’ не может быть вызван

#python #django

#python #django

Вопрос:

Это не всегда этот фрагмент кода, но это самый последний. Кажется, это случайно, какие-нибудь мысли?

 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. Похоже, вы где-то выполняете неправильное назначение.

2. Действительно. В опубликованном вами фрагменте нет ничего «неправильного». Что-то где-то еще вызывает проблему.

3. Есть мысли о том, как это отследить? Как я уже сказал, дело не только в этом коде, но, похоже, это происходит в том же модальном режиме. Мы не можем его реплицировать, поэтому отладка была невозможна.

4. Можете ли вы опубликовать полный код? Я думаю, что после вашего блока try / catch вы используете эту переменную u со значением объекта DoesNotExist. Возможно, вам нужно будет установить в except значение None .

5. Это не просто этот фрагмент кода, это происходило в разных частях приложения в случайное время. Другая запутанная часть, поскольку этот код работал нормально в течение нескольких месяцев, и внезапно мы получаем эти ошибки.

Ответ №1:

Как говорит Крис в комментариях выше, ваш фрагмент является действительным. Где-то еще в вашем коде вы можете неправильно перехватывать исключения.

У вас может быть что-то вроде:

 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 .

Комментарии:

1. Это кажется вероятным кандидатом

2. ПОТРЯСАЮЩЕ! Спасибо, быстрый grep для всех DoesNotExists показал виновника. кроме ключа входа. DoesNotExist, User.DoesNotExist:

3. Да, это полностью устранило проблему, которая беспокоила меня месяцами. Я только что нашел в своем проекте «DoesNotExist», чтобы увидеть, где я мог забыть скобки. Спасибо!

4. Спасибо вам оооочень, очень, очень большое! Я бы никогда не подумал об этом.

5. Спасибо! Сделал мою ночь. Я часами смотрел на этот странный сбой теста.