Как переместить модель Django в другое приложение со ссылками на внешние ключи?


Это расширение к этому вопросу: Как переместить модель между двумя приложениями Django (Django 1.7)

Я хочу переместить модель M из приложения A в приложение B с помощью миграции Django без потери данных. Лучший голосованный ответ на этот вопрос (не принятый, а предложенный Озаном) предполагал использование миграций.SeparateDatabaseAndState и сделать это в два этапа:

  1. миграция для удаления модели и переименования (не удаления) таблицы БД.
  2. миграция создать новую модель и использовать для нее существующую таблицу.

Мне это кажется очень умным способом, однако в моем случае есть другая модель N, которая имеет внешний ключ к M. Теперь, когда я вызываю makemigrations, чтобы сделать файл миграции на втором шаге, я получаю ошибку, потому что на этом этапе модель A. M больше не существует:

ValueError: Lookup failed for model referenced by field C.N.m: A.M  
Есть ли способ справиться с этим?
2 3

2 ответа:

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

  1. Скопируйте модель из A В B. определите db_table, чтобы присвоить ей то же имя таблицы

  2. Выполните миграции для B. измените файл миграции, чтобы создать только состояние, а не таблицу базы данных с помощью миграции.SeparateDatabaseAndState .

  3. Измените внешний ключ в N, чтобы он указывал на B. M вместо A. M (через to= 'B. M').

  4. Сделайте миграцию для этого изменения.

  5. Удалить модель из A.

  6. Сделайте миграцию для удаления. Измените его таким образом, чтобы он удалял только модель, а не таблицу базы данных.

  7. Применяйте все миграции.

Впоследствии таблицу все еще можно было переименовать, однако в версии 1.7 I используйте, миграции не поддерживают изменения db_table.

Вот как бы я с этим справился.

  1. Создайте новую модель в приложении B (включите 1:1Key в модель в приложении A), а также миграцию и новый внешний ключ из модели N в модель приложения B.
  2. Создайте миграцию, чтобы скопировать все данные из старой модели в приложении а в новую модель в приложении В.
  3. Заполните новый FK на модели N. вы сделаете это, используя ключ 1:1 между моделями в приложениях A и B.
  4. обновите весь код и внешние ключи для ссылки на новую модель в приложении B и запустите миграции.
  5. Удалите FK из N в модель приложения A и удалите модель из приложения A. выполните миграцию, чтобы удалить их из базы данных.