重命名一个简单的charfield等似乎很容易(Django - How to rename a model field using South?)
然而,当我尝试在ForeignKey字段上使用相同的内容时,我会得到一个错误:
_mysql_exceptions.OperationalError: (1091, "Can't DROP '[new_fkey_field_name]'; check that column/key exists")
它源于出于某种原因试图向后运行的迁移(如跟踪所示)。
有什么想法吗?
发布于 2013-03-14 17:49:40
更新:使用mysql-5.5.30-1.fc18.x86_64
和
MySQL-python==1.2.4
Django==1.4.2
South==0.7.6
以下工作:
class Migration(SchemaMigration_:
def forwards(self, orm):
db.rename_column('app_model', 'old_id', 'new_id')
db.alter_column('app_model', 'new_id',
self.gf('django.db.models.fields.related.ForeignKey')(
blank=True,
null=True,
to=orm['app.OtherModel']
))
def backwards(self, orm):
db.rename_column('app_model', 'new_id', 'old_id')
db.alter_column('app_model', 'old_id',
self.gf('django.db.models.fields.related.ForeignKey')(
blank=True,
null=True,
to=orm['app.OtherModel']
))
正如@Eloff评论,South找不到最初的FK,原因不明,但似乎并不重要。没有必要进行数据迁移(我相信),因为pk值不应该改变。
字段规范(使用self.gf
)取自南方自动生成的迁移,以保持一致性。
发布于 2011-07-21 09:24:55
首先,您需要使用db列名,而不是模型中的列名。例: foobar_id不是倒计时。
然后,您需要删除fk约束并在重命名之后重新创建它们:
db.drop_foreign_key('app_model', 'old_id')
db.rename_column('app_model', 'old_id', 'new_id')
db.alter_column('app_model', 'new_id', models.ForeignKey(to=orm['app.OtherModel']))
如果您的fk是可空的,则需要使用将其更改为:
db.alter_column('app_model', 'new_id', models.ForeignKey(null=True, to=orm['app.OtherModel']))
发布于 2011-07-26 17:19:44
如果MySQL用户确实仍然适用,那么南方的用户应该知道这个错误:
http://south.aeracode.org/ticket/697
解决办法是分三个步骤进行迁移:
1)添加新字段
2)数据将数据迁移到新字段
3)删除旧字段
https://stackoverflow.com/questions/3485176
复制相似问题