Как упорядочить файлы миграции в разных приложениях в 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 создает эту зависимость автоматически.

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

Вернуться на верх