我想更改模型中特定字段的名称:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
应改为:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
使用南方最简单的方法是什么?
答案 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)
这就是我的所作所为:
myapp/models.py
)./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')
答案 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)
south
添加到已安装的应用中。$ manage.py Schemamigration <app_name> --initial
$ manage.py migrate <app_name> --Fake
$ manage.py Schemamigration --auto
$ manage.py migrate <app_name>
如果你正在使用&#39; pycharm&#39;,那么你可以使用&#39; ctrl + shift + r&#39;而不是&#39; manage.py&#39; ,&#39;转移&#39;参数。