'NoneType' object has no attribute 'get_all_fields' parler
5 января 2019 г. 5:32
Если при создании своей миграции для добавления полей, которые должны быть переводимы, возникает ошибка:
'NoneType' object has no attribute 'get_all_fields'
1 вариант. Обновить parler до новой версии
В новых версиях parler эта ошибка устранена, поэтому достаточно обновить пакет.
2 вариант. Добавить TranslatableModelMixin в базовые классы модели
Просто добавьте MyModel.__bases__ = (models.Model, TranslatableModelMixin)
после объявления MyModel
.
Для наглядности возьмём пример из документации и добавим необходимую строчку:
from django.db import migrations from django.conf import settings from django.core.exceptions import ObjectDoesNotExist def forwards_func(apps, schema_editor): MyModel = apps.get_model('myapp', 'MyModel') MyModel.__bases__ = (models.Model, TranslatableModelMixin) MyModelTranslation = apps.get_model('myapp', 'MyModelTranslation') for object in MyModel.objects.all(): MyModelTranslation.objects.create( master_id=object.pk, language_code=settings.LANGUAGE_CODE, name=object.name ) def backwards_func(apps, schema_editor): MyModel = apps.get_model('myapp', 'MyModel') MyModelTranslation = apps.get_model('myapp', 'MyModelTranslation') for object in MyModel.objects.all(): translation = _get_translation(object, MyModelTranslation) object.name = translation.name object.save() # Note this only calls Model.save() def _get_translation(object, MyModelTranslation): translations = MyModelTranslation.objects.filter(master_id=object.pk) try: # Try default translation return translations.get(language_code=settings.LANGUAGE_CODE) except ObjectDoesNotExist: try: # Try default language return translations.get(language_code=settings.PARLER_DEFAULT_LANGUAGE_CODE) except ObjectDoesNotExist: # Maybe the object was translated only in a specific language? # Hope there is a single translation return translations.get() class Migration(migrations.Migration): dependencies = [ ('yourappname', '0001_initial'), ] operations = [ migrations.RunPython(forwards_func, backwards_func), ]
Дело в том, что при миграции требуется фукнция get_all_fields
, которая доступна в миксине TranslatableModelMixin
, когда мы нашу модель наследуем от TranslatableModel
. Но при миграции из базовых (наследуемых) классов используется только models.Model
, поэтому-то и нужно вручную добавить TranslatableModelMixin
.
Более подробно об этой проблеме вы можете почитать из комментария на гитхабе: https://github.com/django-parler/django-parler/issues/157#issuecomment-386902848.
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0