我有一个 django 项目,它的数据库表已经包含了数据。我希望在不丢失该列中任何数据的情况下更改字段名。我最初的计划是简单地更改模型字段名,而不会实际更改 db 表的名称(使用 db_column
列参数) :
原始模型:
class Foo(models.Model):
orig_name = models.CharField(max_length=50)
新模式:
class Foo(models.Model):
name = models.CharField(max_length=50, db_column='orig_name')
但是,运行 South 的 schemamigration --auto
会生成一个迁移脚本,删除原始列 orig_name
,并添加一个新列 name
,这将产生不必要的副作用,即删除该列中的数据。(我也不明白为什么 South 要更改 db 中列的名称,因为我对 db _ column 的理解是,它允许更改模型字段名称,而不更改数据库表列的名称)。
如果我不能在不改变 db 字段的情况下更改模型字段,我想我可以像下面这样做一个更直接的名称更改:
原始模型:
class Foo(models.Model):
orig_name = models.CharField(max_length=50)
新模式:
class Foo(models.Model):
name = models.CharField(max_length=50)
无论我最终使用哪种策略(我更喜欢第一种,但会发现第二种是可以接受的) ,我主要关心的是确保不会丢失该列中已有的数据。
这是否需要一个多步骤的过程?(例如1。加一列,2。将数据从旧列迁移到新列,3。删除原来的栏目)
或者我可以用类似 db.alter_column
的东西修改迁移脚本吗?
在更改列名的同时保存该列中的数据的最佳方法是什么?