hasattr(value, "contribute_to_class") возвращает KeyError: "contribute_to_class" (Django 4.1)
Проект Django 1.1/Python 2.7, который я пытаюсь запустить на Python 3.10/Django 4.1.
Появляется ошибка, связанная с 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?
1 ответ
hasattr Python2 против 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 не имеет этого метода и не вызывает его.