【发布时间】:2011-03-30 17:08:42
【问题描述】:
我有一个 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_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之类的东西来改变迁移脚本吗?
在更改列名的同时保留该列中的数据的最佳方法是什么?
【问题讨论】:
标签: django-models django-south custom-fields customcolumn