Миграции Django ссылаются на удаленный модуль

У меня есть Model с именем FooModel, определенное в файле my_app/models/foo.py.

После удаления foo.py запуск миграции Django (1.7) вызывает ошибку, поскольку старые файлы миграции импортируют foo.py (import myapp.models.foo.FooModel).

Как мне это решить?

Это происходит, когда модель имеет ImageField с параметром upload_to.


person eugene    schedule 30.04.2015    source источник
comment
Вы удалили FooModel или переместили его?   -  person aumo    schedule 30.04.2015
comment
Иногда удаляю, в этот раз передвинул.   -  person eugene    schedule 30.04.2015


Ответы (2)


Есть два случая:

  1. Вы переместили FooModel в другое место, а затем отредактировали все свои файлы миграции, чтобы отразить это перемещение.

  2. Вы удалили FooModel, в этом случае выполните следующие действия:

    • Put FooModel back to where it was.
    • Убедитесь, что в вашем коде нет ссылок на FooModel.
    • Беги ./manage.py makemigrations my_app
    • Запустите ./manage.py squashmigrations my_app <migration created with the previous comand> — см. документ для получения дополнительной информации о подавление миграций.
    • Повторите два предыдущих шага для любого приложения, которое ссылается на FooModel в своих миграциях.
    • Удалите FooModel и устаревшие файлы миграции, как только убедитесь, что все работает нормально.

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

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

Примечание: в этой ситуации рассматриваемый объект является моделью Django, но это относится к любому классу, функции или модулю, на который ссылаются файлы миграции.

person aumo    schedule 30.04.2015
comment
Спасибо! надеялся, что будет простое решение. Но хорошо знать и лучший вариант, доступный на данный момент. - person eugene; 30.04.2015
comment
Ого, спасибо! Я не знал, что вы можете раздавить миграции. В моем случае это было еще проще, просто раздавив приложение, миграция которого ссылалась на удаленную модель, помогло. - person Alexander Eliseyev; 02.09.2018

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

MyModel = apps.get_model('myapp', 'MyModel')
for row in MyModel.objects.all():
    row.uuid = uuid.uuid4()
    row.save(update_fields=['uuid'])

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

Далее читайте: https://docs.djangoproject.com/en/2.2/howto/writing-migrations/

person apparat    schedule 08.03.2019