Hasattr(value, "contribute_to_class") возвращает KeyError: 'contribute_to_class' (Django 4.0.6)
Проект Django 1.1 / Python 2.7, который я пытаюсь запустить на Python 3.10 / Django 4.0.6.
Появляется ошибка, связанная с Python (например, старый импорт) или ошибка кода django (например, отсутствие поля, которое теперь обязательно), я исправляю ее и запускаю заново.
Текущая ошибка, однако, исходит от
django/db/models/base.py
, из этой функции -
def _has_contribute_to_class(value):
# Only call contribute_to_class() if it's bound.
return not inspect.isclass(value) and hasattr(value, "contribute_to_class")
Я нашел этот билет - https://code.djangoproject.com/ticket/30309
который объясняет, что hasattr
является ненадежным, но, похоже, игнорируется.
Кто-нибудь сталкивался с этой проблемой и смог найти решение, кроме как остаться на Django 1.1?
hasattr Python2 vs hasattr Python3. У них разное поведение
Как работает hasattr() в python 2:
try:
getattr(foo, 'bar')
return True
except:
pass
return False #This is important part
Как работает hasattr() в python 3:
try:
getattr(foo, 'bar')
return True
except AttributeError as error:
return False
raise AttributeError from error
Это означает - если у вас есть какая-либо другая проблема в классе - в python2 hasattr подавлял все. Но Python3 выдает исключение AttributeError.
Поэтому я прошу вас дать нам код класса вашего "значения".
Кстати: Django 4.1 вызывает этот метод _has_contribute_to_class в ModelBase. Django 1.xx не имеет этого метода и не вызывает его.