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 не имеет этого метода и не вызывает его.

Вернуться на верх