Django - Как переименовать поле модели с помощью юга?
Я хотел бы изменить имя определенных полей в модели:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
должен измениться на:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
Какой самый простой способ сделать это с помощью Юга?
Ответы
Ответ 1
Вы можете использовать функцию 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 хотя они верблюжьими).
Ответ 2
Вот что я делаю:
- Изменить имя столбца в вашей модели (в этом примере это будет
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')
Ответ 3
Я не знал о столбце db.rename, звучит удобно, однако в прошлом я добавил новый столбец как один схематизм, затем создал datamigration для перемещения значений в новое поле, затем вторую схему для удаления старый столбец
Ответ 4
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>
Ответ 5
Просто измените модель и запустите makemigrations
в 1.9
Django автоматически обнаруживает, что вы удалили и создали одно поле, и спрашивает:
Did you rename model.old to model.new (a IntegerField)? [y/N]
Скажите "да", и создается правильная миграция. Магия.
Ответ 6
- Добавьте
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" для параметров.