Как упорядочить файлы миграции в разных приложениях в django?
Я работаю над проектом django. Через некоторое время мне захотелось провести рефакторинг кода. Я хотел создать новое приложение и перенести туда некоторые свои модели. Вот пример:
Предположим, у меня есть приложение с именем CategoryApp
и две модели в нем с именами Product
и Category
.
class Category(models.Model):
...
class Product(models.Model):
...
После некоторого времени кодирования я понял, что мне нужно отдельное приложение для Product
. Поэтому я создал новое приложение с именем ProductApp
. И скопировал модель Product
из CategoryApp
в ProductApp
. Я управлял всеми внешними ключами и отношениями соответствующим образом.
Теперь мне нужно создать файлы миграции.
Прежде всего, я создал файл миграции для приложения ProductApp
(python3 manage.py makemigrations ProductApp
), который просто создает новую таблицу productapp_product
в базе данных. Файл миграции называется 0001.py
. Я применил эту миграцию, и новая таблица была создана.
Во-вторых, я создал пустой файл миграции в ProductApp
(python3 manage.py makemigrations ProductApp --empty
). Файл миграции имеет имя 0002.py
Я изменил содержимое пустого файла миграции, чтобы выполнить SQL-запрос для копирования всех данных из таблицы categoryapp_product
в productapp_product
. Я также добавил reverse_sql на случай, если мне понадобится отменить миграцию. Я применил и эту миграцию, и все данные были скопированы в новую таблицу.
В-третьих, я удалил модель Product
из CategoryApp
и создал файл миграции для CategoryApp
. Файл миграции имеет имя 0002.py
. Я применил эту миграцию, и старая таблица теперь удалена.
Я разместил свой код на github. Я зашел на свой VPS-сервер и взял последнюю версию кода. Я выполнил команду pyrhon3 manage.py migrate
в надежде, что все будет работать.
Увы, я получил ошибку, говорящую о том, что categoryapp_product does not exist
при миграции ProductApp/migrations/0002.py
. Django выполнил миграцию CategoryApp/migrations/0002.py
до ProductApp/migrations/0002.py
, в результате чего таблица categoryapp_product
была удалена до того, как ее данные могли быть скопированы в productapp_product
.
Существует ли способ указать порядок миграционных файлов для переноса между приложениями? Или есть ли способ добавить файл миграции в качестве зависимости к другому файлу миграции?
Каково решение этой проблемы?
Или есть ли способ добавить файл миграции в качестве зависимости к другому файлу миграции?
Да. Команда Django makemigrations
делает это автоматически, когда ей удается обнаружить, что одно приложение зависит от другого, скажем, потому что они связаны через ForeignKey
или что-то подобное.
Но вы, конечно, можете добавить зависимости и вручную, если хотите.
Вот законный пример из makemigrations
:
# users/migrations/0001_initial.py
class Migration(migrations.Migration):
initial = True
dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
('organization', '0001_initial'),
]
Список зависимостей, как вы можете видеть, содержит кортежи, где кортеж содержит имя приложения и имя миграции. Моя User
модель объявляет ForeignKey
к модели в Organization
приложении, поэтому Django создает эту зависимость автоматически.
Все миграции, перечисленные в атрибуте зависимости, должны завершиться до выполнения этой, и все операции (включая зависимости) в тех миграциях также должны завершиться. Это означает, что вы должны помнить не только о круговом импорте, но и о круговых миграционных зависимостях.