我想改变一个模型中特定字段的名称:

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


当前回答

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

如果您有一个多词的、驼峰式的模型名,比如projtem,那么表名将是app_projtem(也就是说,项目和项之间不会插入下划线,即使它们是驼峰式的)。

其他回答

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

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

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

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

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

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

如果您有一个多词的、驼峰式的模型名,比如projtem,那么表名将是app_projtem(也就是说,项目和项之间不会插入下划线,即使它们是驼峰式的)。

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>

将south添加到项目设置文件中已安装的应用程序中。 注释掉添加/修改的字段/表。 $ manage.py Schemamigration <app_name>——initial .py $ manage.py migrate <app_name>——false 取消注释字段并写入修改后的字段 $ manage.py Schemamigration——自动 $ manage.py migrate <app_name>

如果你正在使用'pycharm',那么你可以使用'ctrl+shift+r'来代替'manage.py',并使用'shift '来表示参数。