Я хотел бы изменить имя определенных полей в модели:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
должен измениться на:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
Какой самый простой способ сделать это, используя Юг?
python
django
django-models
django-south
Джонатан
источник
источник
Ответы:
Вы можете использовать
db.rename_column
функцию.Первым аргументом
db.rename_column
является имя таблицы, поэтому важно помнить, как Django создает имена таблиц :В том случае , если у вас есть мульти сформулированных, верблюжьего обсаженное имя образцового, такие как ProjectItem, имя таблицы будет
app_projectitem
(т.е. подчеркивание не будет вставлено междуproject
иitem
даже если они верблюжьими обсаженным).источник
Вот что я делаю:
myapp/models.py
)./manage.py schemamigration myapp renaming_column_x --auto
Заметка
renaming_column_x
может быть чем угодно, это просто способ дать описательное имя файлу миграции.Это создаст вам файл с именем,
myapp/migrations/000x_renaming_column_x.py
который удалит ваш старый столбец и добавит новый столбец.Измените код в этом файле, чтобы изменить поведение миграции на простое переименование:
источник
x
илиcolumn_x
?--auto
Первым делом создайте миграцию. Это позволяет избежать проблем с South ORM Freezer, которые возникают, если миграция имеет только методыforwards
иbackwards
методы, но не содержит замороженныйmodel
объект.db.rename_column
что не переименовываются ограничения, связанные со столбцом. Миграция все еще будет работать, но у вас будут ограничения, названные в честь старого имени столбца. У меня был столбец с ограничением уникальности, я переименовал его с помощью этого метода, проверил, что ограничение уникальности все еще существует, и получил ошибку, но имя самого ограничения все еще использует старое имя столбца. Возможно, явныйdb.delete_unique
иdb.create_unique
сделал бы это, но я решил пойти с решением sjh.Я не знал о столбце db.rename, звучит удобно, однако в прошлом я добавлял новый столбец как одну схему миграции, затем создавал миграцию данных для перемещения значений в новое поле, а затем вторую схему миграции для удаления старого столбца
источник
db.rename_column
не будет переименовывать ограничения для вас, поэтому вам придется обрабатывать это вручную. Если вы забудете это сделать, миграция будет работать за исключением того, что без вашего ведома может быть ограничение, все еще использующее старое имя столбца. Мне неясно, является ли проблема просто косметической или в будущей миграции, где ограничение должно быть изменено или отменено, Юг не сможет его найти. В любом случае, делать это здесь, как предполагает sjh, - это безопасный способ сделать это: вы можете позволить Югу понять, что он должен выяснить.Джанго 1.7 ввел миграцию так что теперь вам даже не нужно устанавливать дополнительный пакет для управления миграциями.
Чтобы переименовать вашу модель, вам нужно сначала создать пустую миграцию:
Затем вам нужно отредактировать код вашей миграции следующим образом:
И после этого вам нужно запустить:
источник
Просто поменяйте модель и запустите
makemigrations
в 1.9Django автоматически определяет, что вы удалили и создали одно поле, и спрашивает:
Скажи да, и правильная миграция будет создана. Магия.
источник
south
к установленным приложениям в файле настроек проекта.$ manage.py Schemamigration <app_name> --initial
$ manage.py migrate <app_name> --Fake
$ manage.py Schemamigration --auto
$ manage.py migrate <app_name>
Если вы используете «pycharm», то вы можете использовать «ctrl + shift + r» вместо «manage.py» и «shift» для параметров.
источник