На юге, я могу скопировать значение старого столбца в новый? - PullRequest
2 голосов
/ 02 августа 2011

Одна из моих моделей Django - это подкласс, и я хочу изменить его суперкласс на тот, который очень похож на оригинальный. В частности, новый суперкласс описывает тот же объект и имеет тот же первичный ключ. Как я могу заставить Юг создать новое поле OneToOne и скопировать значения из старого в новое?

1 Ответ

11 голосов
/ 03 августа 2011

На юге существует два вида миграции: миграция схемы и миграция данных.

После создания схемы миграции создайте соответствующую миграцию данных:

./manage.py datamigration <app> <migration_name>

Не запускать миграцию (пока). Вместо этого откройте файл миграции, который вы только что создали.

Вы найдете метод с именем forwards(). Для этого вы определяете процедуру копирования значений из старых таблиц в новые таблицы.

Если вы изменяете структуру данной таблицы на более сложную компоновку, общий метод состоит в том, чтобы две миграции схемы включали перенос данных: первая миграция схемы добавляет поля, перенос данных переводит старые поля в новые поля, а вторая схема миграции удаляет старые поля. С помощью базы данных forwards() вы можете делать практически все, что угодно, при условии, что вы отслеживаете, к какой схеме (предыдущей или текущей) вы обращаетесь. Как правило, вы читаете только с orm. -связи и пишете на традиционные средства доступа Django.

Обучающее руководство по South Data Migration раскрывает некоторые детали В нем показано, как использовать ссылку orm Юга для доступа к базе данных с использованием схемы до переноса схемы, и дает доступ к базе данных без жалоб Django на поля, которые он не понимает.

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

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

...