Django的 – 如何重命名模型字段使用南?

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

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如何创build表名是很重要的:

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

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

这就是我所做的:

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

我不知道db.rename列,听起来很方便,但是在过去,我已经添加了新的列作为一个schemamigration,然后创build一个datamigration将值移动到新的字段,然后第二个schemamigration删除旧的列

Django 1.7引入了Migrations,所以现在你甚至不需要安装额外的包来pipe理你的迁移。

要重命名模型,您需要先创build空迁移:

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

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

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

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

说是,并且正确的迁移得到创build。 魔法。

  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”作为参数。