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

217 投票
6 回答
41534 浏览
提问于 2025-04-16 01:13

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

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

应该改成:

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

使用South来做到这一点,最简单的方法是什么?

6 个回答

15

我之前不知道有 db.rename 这个功能,听起来很方便。不过在过去,我是先添加一个新列作为一个模式迁移,然后再创建一个数据迁移,把旧列里的值移动到新列里,最后再做一个模式迁移来删除旧列。

39

这是我做的步骤:

  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')
232

你可以使用 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 会根据你的模型类的名字和包含它的应用来自动生成数据库表的名字。模型的数据库表名是通过将模型的“应用标签”(也就是你在 manage.py startapp 时使用的名字)和模型的类名用下划线连接起来构成的。

比如,如果你的模型名是由多个单词组成的驼峰命名法(camel case),像 ProjectItem,那么生成的表名就是 app_projectitem(也就是说,即使是驼峰命名法,projectitem 之间也不会插入下划线)。

撰写回答