Джанго - Как переименовать поле модели, используя Юг? - PullRequest
208 голосов
/ 13 июля 2010

Я хотел бы изменить имя определенных полей в модели:

class Foo(models.Model):
    name = models.CharField()
    rel  = models.ForeignKey(Bar)

должно измениться на:

class Foo(models.Model):
    full_name     = models.CharField()
    odd_relation  = models.ForeignKey(Bar)

Какой самый простой способ сделать это, используя Юг?

Ответы [ 6 ]

229 голосов
/ 13 июля 2010

Вы можете использовать функцию 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 автоматически получает имя таблицы базы данных из имени класса вашей модели и приложения, в котором она содержится.Имя таблицы базы данных модели создается путем присоединения «метки приложения» модели - имени, которое вы использовали в manage.py startapp - к имени класса модели с подчеркиванием между ними.

InВ случае, когда у вас есть многоязычное имя модели в верблюжьем корпусе, например ProjectItem, имя таблицы будет app_projectitem (т. е. подчеркивание не будет вставлено между project и item, даже если они верблюжьи-cased).

39 голосов
/ 30 ноября 2013

Вот что я делаю:

  1. Измените имя столбца в вашей модели (в этом примере это будет myapp/models.py)
  2. Выполнить ./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')
15 голосов
/ 13 июля 2010

Я не знал о столбце db.rename, звучит удобно, однако в прошлом я добавлял новый столбец как одну схему миграции, затем создавал миграцию данных для перемещения значений в новое поле, а затем вторую схему миграции, чтобы удалить старая колонна

9 голосов
/ 24 марта 2015

В Django 1.7 введено Миграции , поэтому теперь вам даже не нужно устанавливать дополнительный пакет для управления миграциями.

Чтобы переименовать модель, сначала нужно создать пустую миграцию:

$ 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]

Скажите «да», и будет создана правильная миграция. Магия.

0 голосов
/ 29 августа 2014
  1. Добавьте south к установленным приложениям в файле настроек проекта.
  2. Закомментируйте добавленное / измененное поле / таблицу.
  3. $ manage.py Schemamigration <app_name> --initial
  4. $ manage.py migrate <app_name> --Fake
  5. Снимите комментарий с поля и напишите измененное
  6. $ manage.py Schemamigration --auto
  7. $ manage.py migrate <app_name>

Если вы используете«pycharm», тогда вы можете использовать «ctrl + shift + r» вместо «manage.py» и «shift» для параметров.

...