Я пытаюсь удалить конкретную родительскую модель и скопировать некоторые из ее полей непосредственно в дочернюю модель. Я выполнял аналогичный процесс несколько раз, прежде чем использовать South (та же родительская модель для других детей), но после обновления до Django 1.7 игра просто не работает. Django выдает следующую ошибку во время процесса migrate
:
FieldError: Local field <field_name> in class <child_model> clashes with field of similar name from base class <parent_model>
В тот момент, когда запускаются и makemigrations
, и migrate
, и возникает эта ошибка, родительская модель больше не отображается в коде как родитель класса, но миграция все еще жалуется.
Подобный вопрос задавался здесь раньше, и принятое решение включает создание новой модели, копирование в нее данных, замену существующей модели , и копирование данных обратно. К сожалению, в моем случае этот подход не сработает. Это устоявшаяся модель с многочисленными внешними ключами, указывающими на нее, которые будут потеряны, если исходные записи будут удалены.
(Упрощенный) подход, который я использовал в South, был следующим:
- Удалите модель как родительскую и добавьте новые поля в дочернюю.
- Добавьте явное поле первичного ключа с тем же именем, что и у старого автоматического поля
*_ptr_id
. Запустите
schemamigration
и отредактируйте файл следующим образом:- Remove South's attempt to remove and recreate the
*_ptr
field - Добавьте некоторую пользовательскую логику, чтобы удалить ForeignKey-ness поля
*_ptr_id
и добавить PrimaryKey-ness
- Remove South's attempt to remove and recreate the
- Используйте
datamigration
, чтобы получить значения от старого родителя и добавить их в новые поля дочернего элемента.
Я надеялся, что этот подход будет достаточно легко адаптирован к собственным миграциям Django, и я получил (с некоторыми изменениями) логику замены полей *_ptr_id
. Но Django не позволяет мне добавлять новые поля. Я пробовал следующее:
- Удаление родительской модели и выполнение пользовательской замены
*_ptr_id
, миграция и добавление полей в качестве второй миграции. - Удаление родительской модели и не редактирование файла для ручного взаимодействия с
*_ptr_id
, но сохранение операций удаления/добавления Django и миграция с--fake
.
В обоих сценариях более поздняя миграция, которая добавляет новые поля с теми же именами, что и у старого родителя, вызывает указанную выше ошибку. Джанго отказывается признать, что старая родительская модель больше не является родителем класса.
У кого-нибудь еще была эта проблема и удалось ее обойти?
Изменить:
По-видимому, это вызвано аргументом bases
класса операций схемы CreateModel
, в котором указана родительская модель, и отсутствием соответствующей операции для обновления списка. В документации для CreateModel
этот аргумент указан как необязательный, но Существуют ли какие-либо побочные эффекты при ручном изменении этого значения в ранее примененной миграции?