Какой порядок миграции использует Юг для разных приложений? - PullRequest
8 голосов
/ 19 сентября 2011

Я недавно начал использовать Юг для миграций в моем проекте Django.До недавнего времени все шло хорошо.

В моем проекте есть два приложения, скажем, App-A и App-B.Модель в App-A имеет внешний ключ к модели в App-B.Когда я пытался собрать свою систему, я запустил syndb, который создал все таблицы auth_ и south_.Затем я запустил migrate, который вырвал ошибки.Когда он попытался создать модель из App-A, которая ссылалась на модель из App-B, модель App-B еще не была перенесена / создана, и поэтому возникла ошибка.

Чтобы устранить эту проблему,Сначала мне пришлось вручную перенести App-B, а затем App-A.Я что-то здесь не так делаю?Как Юг должен знать порядок миграции между приложениями?

Спасибо.

Ответы [ 2 ]

16 голосов
/ 20 сентября 2011

Это объясняется https://south.readthedocs.io/en/latest/dependencies.html.

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

К счастью, у нас также была эта проблема, поэтому у Юга есть система зависимостей.Внутри миграции вы можете объявить, что это зависит от того, будет ли другое приложение сначала запускать определенную миграцию;например, если мое приложение «форум» зависит от приложения «учетные записи», создавшего свою таблицу профилей пользователей, мы можем сделать следующее:

# forum/migrations/0002_post.py class Migration:

    depends_on = (
        ("accounts", "0003_add_user_profile"),
    )

    def forwards(self):

Затем, если вы попытаетесь перейти на 0002_post или дальше в форумеПриложение сначала проверит, что учетные записи перенесены как минимум до 0003_add_user_profile, и, если нет, перенесет их для вас.

Зависимости также работают в обратном порядке;Саут знает, что не нужно отменять эту миграцию 0003_add_user_profile, пока она не отменит миграцию 0002_post.

У вас может быть несколько зависимостей и все виды дурацких структур;однако есть два правила:

Нет циклических зависимостей (две или более миграции зависят друг от друга) Нет восходящих зависимостей в одном приложении (поэтому нельзя сделать 0002_post в приложении форума зависимым от 0003_room вто же самое приложение, напрямую или через цепочку зависимостей.

12 голосов
/ 19 сентября 2011

South переносит приложения в порядке их появления в кортеже INSTALLED_APPS в settings.py. Поэтому просто убедитесь, что App-B стоит перед App-A в вашем файле settings.py, и он должен работать:)

...