Подтвердить что ты не робот

Ошибка такого столбца в приложении Django после южной миграции

Я столкнулся с тем же вопросом, который был представлен комментатором здесь: Django South - таблица уже существует

Не было никаких последующих действий, поэтому я решил опубликовать новый вопрос. У меня есть приложение Django, чьи миграции я управляю с Югом. Я добавил поле в свою модель, а затем запустил

./manage schemamigration my_app --auto

который работал как ожидалось. Запуск

./manage migrate my_app
Тем не менее,

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

./manage migrate my_app --fake

разрешила ошибку таблицы, но теперь я получаю ошибку Django, что столбец, связанный с новым полем, не существует.

./manage sqlall my_app

показывает схему как ожидалось.

Любые мысли о том, как исправить это, оцениваются!

4b9b3361

Ответ 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, но затем удаляет значение по умолчанию при следующей миграции.

Это укусило меня в прошлом. Надеюсь, это поможет кому-то в будущем.