Django - 如何使用South重命名模型字段?

时间:2010-07-13 09:53:02

标签: python django django-models django-south

我想更改模型中特定字段的名称:

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 个答案:

答案 0 :(得分:229)

您可以使用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 creates table names的方式非常重要:

  

Django自动从模型类的名称和包含它的应用程序派生数据库表的名称。模型的数据库表名称是通过将模型的“app label”(您在manage.py startapp中使用的名称)加入模型的类名称,并在它们之间加下划线来构建的。

如果您有一个多措辞,类似于驼峰的模型名称,例如ProjectItem,则表名将为app_projectitem(即,project之间不会插入下划线item即使它们是驼峰式的。{/ p>

答案 1 :(得分:39)

这就是我的所作所为:

  1. 在模型中更改列名称(在此示例中为myapp/models.py
  2. 运行./manage.py schemamigration myapp renaming_column_x --auto
  3. 注意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')
    

答案 2 :(得分:15)

我不知道db.rename列,听起来很方便,但是在过去我将新列添加为一个schemamigration,然后创建了一个数据迁移,将值移动到新字段,然后第二个schemamigration删除旧栏目

答案 3 :(得分:9)

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>

答案 4 :(得分:5)

只需更改模型并在1.9

中运行makemigrations

Django会自动检测到您已删除并创建了一个字段,并询问:

Did you rename model.old to model.new (a IntegerField)? [y/N]

说是,并创建了正确的迁移。魔法。

答案 5 :(得分:0)

  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>
  8. 如果你正在使用&#39; pycharm&#39;,那么你可以使用&#39; ctrl + shift + r&#39;而不是&#39; manage.py&#39; ,&#39;转移&#39;参数。