Во-первых, я бы не стал использовать псевдоним db_table
, если вы можете.Это усложняет понимание структуры таблицы, поскольку она больше не синхронизируется с моделями.
Во-вторых, южный API предлагает функции, подобные db.rename_table()
, которые можно использовать путем ручного редактирования файла миграции.Вы можете переименовать таблицу accounts_account_friends
в accounts_relation
(как Django назвал бы ее по умолчанию) и добавить дополнительные столбцы.
Это объединение дает вам следующую миграцию:
def forwards(self, orm):
# the Account.friends field is a many-to-many field which got a through= option now.
# Instead of dropping+creating the table (or aliasing in Django),
# rename it, and add the required columns.
# Rename table
db.delete_unique('accounts_account_friends', ['from_account', 'to_account'])
db.rename_table('accounts_account_friends', 'accounts_relationship')
# Add extra fields
db.add_column('accounts_relationship', 'some_field', ...)
# Restore unique constraint
db.create_unique('accounts_relationship', ['from_account', 'to_account'])
def backwards(self, orm):
# Delete columns
db.delete_column('accounts_relationship', 'some_field')
db.delete_unique('accounts_relationship', ['from_account', 'to_account'])
# Rename table
db.rename_table('accounts_relationship', 'accounts_account_friends')
db.create_unique('accounts_account_friends', ['from_account', 'to_account'])
models = {
# Copy this from the final-migration.py file, see below
}
Уникальное отношение удаляется и воссоздается, поэтому ограничение имеет правильное имя.
Операторы добавления столбцов легко генерируются с помощью следующего трюка:
- Добавление модели
Relationship
в models.py
только с полями внешнего ключа и без изменений в поле M2M. - Перенос на него
- Добавление полей в модель
Relationship
. - Сделайте
./manage.py schemamigration app --auto --stdout | tee final-migration.py | grep column
- Отменить первую миграцию.
Тогда у вас есть все необходимое для создания файла миграции.