2012-03-05 3 views
3

Мне нужно переименовать внешний ключ в моей модели django, используя южные миграции. Я думал, что мне повезло, когда я нашел эту тему How to rename a foreignkey field with South? Однако все описанные здесь методы терпят неудачу, с различными ошибками. Кто-нибудь действительно знает правильный способ сделать это?Как переименовать внешний ключ в django-south, правильный путь

Я хочу, чтобы переименовать SomeModel.registered_to = models.ForeignKey(User) в SomeModel.owner = models.ForeignKey(User) и поддерживать связь между User и owner Любая помощь будет оценен по достоинству!

ответ

3

Измените название поля и запустите python manage.py schemamigration --auto yourapp. Юг добавит код, чтобы удалить столбец и добавить новый. Предоставление Юга генерации миграции гарантирует, что ORM будет заморожен должным образом, поэтому все, что вам нужно сделать, - это просто изменить фактическую миграцию, чтобы переименовать вместо drop и add. Просто удалите эти строки из вперед и назад миграций в и заменить их:

def forwards(self, orm): 
    db.rename_column('yourapp_yourmodel', 'registered_to_id', 'owner_id') 

def backwards(self, orm): 
    db.rename_column('yourapp_yourmodel', 'owner_id', 'registered_to_id') 

Сохранить, а затем перенести приложение.

+0

Эта техника была упомянута в потоке, который я связал с выше, и я попробовал это. Кажется, что он работает, не исключает никаких исключений. Но после завершения любой попытки доступа к 'SomeModel.owner' будет поднять' DoNotExist' –

+3

В Postgres это, похоже, работает для изменения имени внешнего ключа. Имя ограничения остается таким же, хотя ... это имеет значение? – Nils

Смежные вопросы