Django 带数据迁移 Model
Django 的 Model 迁移默认是先删除改表然后在另一个地方创建表,这时候会删除老的表的数据,但是有时候需要带着数据迁移。
参考: Stack Overflow
具体操作:
- 删除Model,添加Model到新的app中,然后执行 makemigrations。
- 会在老的app的migrations的文件下和新的app的migrations文件下多出两个新的migtations文件。
先修改 Delete 的 Model 文件
先修改删除Model的文件:(TheModel 是 Model 名字)(newapp_themodel是数据库表名字)
class Migration(migrations.Migration):
dependencies = []
database_operations = [
migrations.AlterModelTable('TheModel', 'newapp_themodel')
]
state_operations = [
migrations.DeleteModel('TheModel')
]
operations = [
migrations.SeparateDatabaseAndState(
database_operations=database_operations,
state_operations=state_operations)
]
Django的Model操作分为两个部分,一个是状态操作(state_operations)和数据库操作(database_operations),使用SeparateDetabaseAndState 分离这两部操作,默认是不分离的。
由于需要保护数据,所有在状态上我们要删除这个Model,但是并不在数据库中删除该表,只是重命名该表。
修改迁移后的 Model 文件
然后在修改创建Model的文件:
class Migration(migrations.Migration):
dependencies = [
('old_app', 'above_migration')
]
state_operations = [
migrations.CreateModel(
name='TheModel',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
],
options={
'db_table': 'newapp_themodel',
},
bases=(models.Model,),
)
]
operations = [
migrations.SeparateDatabaseAndState(state_operations=state_operations)
]
这一步只需要把操作编程状态操作就可以了,并不实际操作数据库,这样就完成了migrations文件的修改。
最后 migrate 搞定收工。