'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