我计划重命名现有 Django 项目中的多个模型,其中有许多其他模型与我要重命名的模型具有外键关系。我相当确定这将需要多次迁移,但我不确定确切的过程。
假设我从 Django 应用程序中的以下模型开始,名为myapp
:
class Foo(models.Model):
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
foo = models.ForeignKey(Foo)
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
foo = models.ForeignKey(Foo)
is_ridonkulous = models.BooleanField()
我想重命名Foo
模型,因为该名称实际上没有意义并且会导致代码混乱,并且Bar
会让一个更清晰的名字。
根据我在 Django 开发文档中阅读的内容,我假设以下迁移策略:
Step 1
Modify models.py
:
class Bar(models.Model): # <-- changed model name
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
foo = models.ForeignKey(Bar) # <-- changed relation, but not field name
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
foo = models.ForeignKey(Bar) # <-- changed relation, but not field name
is_ridonkulous = models.BooleanField()
请注意AnotherModel
的字段名称foo
没有改变,但是关系更新为Bar
模型。我的理由是,我不应该立即更改太多,并且如果我将此字段名称更改为bar
我可能会冒丢失该列中数据的风险。
Step 2
创建一个空的迁移:
python manage.py makemigrations --empty myapp
Step 3
编辑Migration
在步骤 2 中创建的迁移文件中添加RenameModel
操作到操作列表:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0001_initial'),
]
operations = [
migrations.RenameModel('Foo', 'Bar')
]
Step 4
应用迁移:
python manage.py migrate
Step 5
编辑相关字段名称models.py
:
class Bar(models.Model):
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
bar = models.ForeignKey(Bar) # <-- changed field name
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
bar = models.ForeignKey(Bar) # <-- changed field name
is_ridonkulous = models.BooleanField()
Step 6
创建另一个空迁移:
python manage.py makemigrations --empty myapp
Step 7
编辑Migration
类在步骤 6 中创建的迁移文件中添加RenameField
操作列表中任何相关字段名称的操作:
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_rename_fields'), # <-- is this okay?
]
operations = [
migrations.RenameField('AnotherModel', 'foo', 'bar'),
migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]
Step 8
应用第二次迁移:
python manage.py migrate
除了更新其余代码(视图、表单等)以反映新变量名称之外,这基本上是新迁移功能的工作方式吗?
另外,这似乎有很多步骤。迁移操作可以以某种方式压缩吗?
Thanks!