Django миграций: сбой при переносе данных, ссылающийся на уже удаленное поле модели - PullRequest
1 голос
/ 03 февраля 2020

При создании тестовой базы данных Django вызывает это исключение

django.core.exceptions.FieldError: Cannot resolve keyword 'xxx' into field. Choices are: ...

Неудачная миграция является пользовательской, перемещая данные из (скажем) ModelA в ModelB:

def forwards(apps, schema_editor):
    ...
    prev_list = ModelA.objects.all().values_list('xxx').distinct()
    for item in prev_list:
        ModelB(xxx=item).save()

Мое следующее движение было проверено ModelA, которое, как и следовало ожидать, не имеет поля с именем XXX

class ModelA(Model):
   # no field named xxx

Немного покопаться в том, что здесь произошло:

  1. ModelA раньше имел поле с именем xxx
  2. , при миграции выполняется попытка создания ModelB строк, считывающих из ModelA.xxx
  3. ModelA hasn ' у меня нет такого поля, так как при последующем переносе это поле удаляется, поэтому у меня нет поля, объявленного в моей модели.

Почему не удается создать тестовую базу данных (с python manage.py test )?
как я могу это исправить?

1 Ответ

1 голос
/ 03 февраля 2020

Вы не должны импортировать ModelA напрямую, но импортировать историческую версию, как показано ниже (см. Документацию по написанию миграций здесь ).

ModelA = apps.get_model('myapp', 'ModelA')

Согласно документы , вы можете отредактировать старую миграцию, если столкнетесь с этой проблемой:

... проблемы исторической модели могут быть не сразу очевидны. Если вы столкнетесь с таким типом ошибки, то можно отредактировать миграцию, чтобы использовать исторические модели, а не прямой импорт, и зафиксировать эти изменения.

...