Я хотел бы изменить имя определенных полей в модели:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
должен измениться на:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
Какой самый простой способ сделать это с помощью Юга?
Вы можете использовать функцию db.rename_column
.
class Migration:
def forwards(self, orm):
# Rename 'name' field to 'full_name'
db.rename_column('app_foo', 'name', 'full_name')
def backwards(self, orm):
# Rename 'full_name' field to 'name'
db.rename_column('app_foo', 'full_name', 'name')
Первым аргументом db.rename_column
является имя таблицы, поэтому важно помнить, как Django создает имена таблиц:
Django автоматически выводит имя таблицы базы данных из имени вашего класса модели и приложения, которое его содержит. Имя таблицы базы данных модели создается путем присоединения к модели "метка приложения" - имя, которое вы использовали в файле управления .py startapp - с именем класса модели, с подчеркиванием между ними.
В случае, если у вас есть многословное имя модели с верблюжьим корпусом, такое как ProjectItem, имя таблицы будет app_projectitem
(т.е. подчеркивание не будет вставлено между project
и item
even хотя они верблюжьими).
Вот что я делаю:
myapp/models.py
)./manage.py schemamigration myapp renaming_column_x --auto
Примечание renaming_column_x
может быть любым, что вам нравится, это просто способ дать описательное имя в файле миграции.
Это создаст файл с именем myapp/migrations/000x_renaming_column_x.py
, который удалит старый столбец и добавит новый столбец.
Измените код в этом файле, чтобы изменить поведение переноса на простое переименование:
class Migration(SchemaMigration):
def forwards(self, orm):
# Renaming column 'mymodel.old_column_name' to 'mymodel.new_column_name'
db.rename_column(u'myapp_mymodel', 'old_column_name', 'new_column_name')
def backwards(self, orm):
# Renaming column 'mymodel.new_column_name' to 'mymodel.old_column_name'
db.rename_column(u'myapp_mymodel', 'new_column_name', 'old_column_name')
x
или column_x
?
Я не знал о столбце db.rename, звучит удобно, однако в прошлом я добавил новый столбец как один схематизм, затем создал datamigration для перемещения значений в новое поле, затем вторую схему для удаления старый столбец
Django 1.7 представил Migrations, поэтому теперь вам даже не нужно устанавливать дополнительный пакет для управления вашими миграциями.
Чтобы переименовать вашу модель, сначала необходимо создать пустую миграцию:
$ manage.py makemigrations <app_name> --empty
Затем вам нужно изменить свой код перехода следующим образом:
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('yourapp', 'XXXX_your_previous_migration'),
]
operations = [
migrations.RenameField(
model_name='Foo',
old_name='name',
new_name='full_name'
),
migrations.RenameField(
model_name='Foo',
old_name='rel',
new_name='odd_relation'
),
]
И после этого вам нужно запустить:
$ manage.py migrate <app_name>
Просто измените модель и запустите makemigrations
в 1.9
Django автоматически обнаруживает, что вы удалили и создали одно поле, и спрашивает:
Did you rename model.old to model.new (a IntegerField)? [y/N]
Скажите "да", и создается правильная миграция. Магия.
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" для параметров.