212

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

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 最简单的方法是什么?

4

6 回答 6

231

您可以使用该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 中使用的名称)与模型的类名连接起来而构建的,它们之间使用下划线。

如果您有一个多字的驼峰式模型名称,例如 ProjectItem,则表名将是(即,即使它们是驼峰式app_projectitem,也不会在它们之间插入下划线)。projectitem

于 2010-07-13T10:26:56.057 回答
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')
于 2013-11-30T15:57:35.027 回答
15

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

于 2010-07-13T16:49:30.137 回答
11

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>
于 2015-03-24T08:29:21.197 回答
5

只需更改模型并makemigrations在 1.9 中运行

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

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

说是,就会创建正确的迁移。魔法。

于 2016-05-15T13:07:58.747 回答
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>

如果您使用的是 'pycharm',那么您可以使用 'ctrl+shift+r' 代替 'manage.py' ,并使用 'shift ' 作为参数。

于 2014-08-29T11:22:52.617 回答