Как переместить модель Django в другое приложение со ссылками на внешние ключи?
Это расширение к этому вопросу: Как переместить модель между двумя приложениями Django (Django 1.7)
Я хочу переместить модель M из приложения A в приложение B с помощью миграции Django без потери данных. Лучший голосованный ответ на этот вопрос (не принятый, а предложенный Озаном) предполагал использование миграций.SeparateDatabaseAndState и сделать это в два этапа:
- миграция для удаления модели и переименования (не удаления) таблицы БД.
- миграция создать новую модель и использовать для нее существующую таблицу.
Мне это кажется очень умным способом, однако в моем случае есть другая модель N, которая имеет внешний ключ к M. Теперь, когда я вызываю makemigrations, чтобы сделать файл миграции на втором шаге, я получаю ошибку, потому что на этом этапе модель A. M больше не существует:
ValueError: Lookup failed for model referenced by field C.N.m: A.M
Есть ли способ справиться с этим?2 ответа:
Вот как я в конце концов это сделал. Основная идея заключается в создании новой модели до удаления старой, как предложил шиллингт, но также и с использованием миграций.SeparateDatabaseAndState, чтобы избежать изменений базы данных, как в связанном вопросе.
Скопируйте модель из A В B. определите db_table, чтобы присвоить ей то же имя таблицы
Выполните миграции для B. измените файл миграции, чтобы создать только состояние, а не таблицу базы данных с помощью миграции.SeparateDatabaseAndState .
Измените внешний ключ в N, чтобы он указывал на B. M вместо A. M (через to= 'B. M').
Сделайте миграцию для этого изменения.
Удалить модель из A.
Сделайте миграцию для удаления. Измените его таким образом, чтобы он удалял только модель, а не таблицу базы данных.
Применяйте все миграции.
Впоследствии таблицу все еще можно было переименовать, однако в версии 1.7 I используйте, миграции не поддерживают изменения db_table.
Вот как бы я с этим справился.
- Создайте новую модель в приложении B (включите 1:1Key в модель в приложении A), а также миграцию и новый внешний ключ из модели N в модель приложения B.
- Создайте миграцию, чтобы скопировать все данные из старой модели в приложении а в новую модель в приложении В.
- Заполните новый FK на модели N. вы сделаете это, используя ключ 1:1 между моделями в приложениях A и B.
- обновите весь код и внешние ключи для ссылки на новую модель в приложении B и запустите миграции.
- Удалите FK из N в модель приложения A и удалите модель из приложения A. выполните миграцию, чтобы удалить их из базы данных.