我计划在一个现有的Django项目中重命名几个模型,其中有许多其他模型与我想要重命名的模型具有外键关系。我相当肯定这将需要多次迁移,但我不确定确切的过程
假设我从Django应用程序中名为myapp的以下模型开始:
类Foo(models.Model):
name=models.CharField(unique=True,最大长度=32)
description=models.TextField(null=True,blank=True)
类AnotherModel(models.Model):
foo=models.ForeignKey(foo)
is_awesome=models.BooleanField()
类YetAnotherModel(models.Model):
foo=models.ForeignKey(foo)
is_ridonkulous=models.BooleanField()
我想重命名Foo模型,因为该名称没有真正意义,并且会在代码中造成混乱,Bar会使名称更清晰
根据我在Django开发文档中读到的内容,我假设以下迁移策略:
第一步
修改模型.py:
类栏(models.Model):#<;-更改型号名称
name=models.CharField(unique=True,最大长度=32)
description=models.TextField(null=True,blank=True)
类AnotherModel(models.Model):
foo=models.ForeignKey(Bar)#<;——已更改关系,但未更改字段名
is_awesome=models.BooleanField()
类YetAnotherModel(models.Model):
foo=models.ForeignKey(Bar)#<;——已更改关系,但未更改字段名
is_ridonkulous=models.BooleanField()
注意,foo的AnotherModel字段名没有改变,但关系更新为Bar模型。我的理由是,我不应该一次更改太多,如果我将此字段名更改为bar,我将有可能丢失该列中的数据
步骤2
创建空迁移:
python manage.py makemigrations--清空myapp
步骤3
编辑在步骤2中创建的迁移文件中的迁移类,将重命名模型操作添加到操作列表中:
类迁移(migrations.Migration):
依赖项=[
(“myapp”,“0001_首字母”),
]
操作=[
迁移。重命名模型(’Foo’,’Bar’)
]
步骤4
应用迁移:
python manage.py迁移
步骤5
编辑models.py中的相关字段名称:
类栏(models.Model):
name=models.CharField(unique=True,最大长度=32)
description=models.TextField(null=True,blank=True)
类AnotherModel(models.Model):
bar=模型。ForeignKey(bar)#<;--更改字段名
is_awesome=models.BooleanField()
类YetAnotherModel(models.Model):
bar=型号。外键(bar)#<;——更改字段名
is_ridonkulous=models.BooleanField()
步骤6
创建另一个空迁移:
python manage.py makemigrations--清空myapp
步骤7
编辑在步骤6中创建的迁移文件中的迁移类,将任何相关字段名的重命名字段操作添加到操作列表中:
类迁移(migrations.Migration):
依赖项=[
(’myapp’、’0002_重命名_字段’)、#<;–这样可以吗?
]
操作=[
migrations.RenameField(’AnotherModel’,’foo’,’bar’),
migrations.RenameField(’YetAnotherModel’,’foo’,’bar’)
]
步骤8
应用第二次迁移:
python manage.py迁移
除了更新代码的其余部分(视图、表单等)以反映新的变量名之外,新的迁移功能基本上就是这样工作的吗
而且,这似乎需要很多步骤。迁移操作可以以某种方式压缩吗
谢谢
所以当我尝试这个时,你似乎可以浓缩步骤3-7:
类迁移(migrations.Migration):
依赖项=[
(’myapp’,’0001_Uinitial’),
]
操作=[
migrations.RenameModel(’Foo’,’Bar’),
migrations.RenameField(’AnotherModel’,’foo’,’bar’),
migrations.RenameField(’YetAnotherModel’,’foo’,’bar’)
]
如果不更新导入文件的名称,例如admin.py甚至更早的迁移文件(!),可能会出现一些错误
更新:正如Cesaro提到的,较新版本的Django通常能够检测并询问模型是否重命名。因此,请先尝试manage.py makemigrations,然后检查迁移文件