Django迁移策略,用于重命名模型和关系字段

我计划在一个现有的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()

注意,fooAnotherModel字段名没有改变,但关系更新为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,然后检查迁移文件

发表评论