Ошибка такого столбца в приложении Django после южной миграции
Я столкнулся с тем же вопросом, который был представлен комментатором здесь: Django South - таблица уже существует
Не было никаких последующих действий, поэтому я решил опубликовать новый вопрос. У меня есть приложение Django, чьи миграции я управляю с Югом. Я добавил поле в свою модель, а затем запустил
./manage schemamigration my_app --auto
который работал как ожидалось. Запуск
./manage migrate my_app
Тем не менее,
привел к ошибке, указывающей на то, что таблица, связанная с измененной моделью, уже существует. Это привело меня к вышеупомянутому связанному вопросу, поэтому запустите
./manage migrate my_app --fake
разрешила ошибку таблицы, но теперь я получаю ошибку Django, что столбец, связанный с новым полем, не существует.
./manage sqlall my_app
показывает схему как ожидалось.
Любые мысли о том, как исправить это, оцениваются!
Ответы
Ответ 1
Вероятно, самый простой способ - начать миграцию с нуля.
Удалите все файлы migrations/*
для приложения, которое вы пытаетесь исправить. Восстановите models.py
до состояния, которое находится в данный момент в базе данных (с помощью инструментов управления версиями или просто закомментируйте новые поля). Затем инициализируйте миграции:
manage.py migrate my_app --delete-ghost-migrations
manage.py schemamigration my_app --init
manage.py migrate my_app --fake
Это создаст запись при миграции текущей структуры базы данных.
Теперь добавьте свои изменения в models.py
, а теперь юг изменится:
manage.py schemamigration my_app --auto
manage.py migrate my_app
Ответ 2
Что-то еще, на что нужно обратить внимание: вы часто будете получать эту ошибку (DatabaseError: no such column: appname_model.fieldname
), если вы используете значение default
в отношении ForeignKey
и добавляете поле к этой модели FK.
Что-то вроде (в вашем models.py
):
class MyAppModel(models.Model):
my_foreign_key = models.ForeignKey(FkModel,
default=lambda: FkModel.objects.get(id=1),
null=True)
Затем в новой миграции вы добавите новое поле в свой FkModel:
class FkModel(models.Model):
new_field = models.IntegerField('New Field Name', blank=True, null=True)
При запуске юга schemamigration
вы получите сообщение об ошибке:
DatabaseError: no such column: myappmodel_fkmodel.new_field
Вы можете решить эту проблему, убедившись, что ваша первоначальная миграция South включает эту функцию значения по умолчанию lambda
, но затем удаляет значение по умолчанию при следующей миграции.
Это укусило меня в прошлом. Надеюсь, это поможет кому-то в будущем.