13

重命名一个简单的字符域等似乎很容易(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")

这源于迁移由于某种原因试图向后运行(如跟踪所示)。

有任何想法吗?

4

4 回答 4

24

首先,您需要使用 db 列名而不是模型中的列名。例如:foobar_id 不是 foobar。

然后您需要删除 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-21T09:24:55.807 回答
11

MySQL 用户应该注意南方的这个错误,如果它确实仍然适用:

http://south.aeracode.org/ticket/697

解决方法是分 3 个步骤进行迁移:

1) 添加新字段

2) data 将数据迁移到新字段

3)删除旧字段

于 2011-07-26T17:19:44.803 回答
6

重命名 aForeignKey时,请记住添加_id到您在 Django 中使用的字段名称的末尾。例如

db.rename_column('accounts_transaction', 'operator_id', 'responsible_id')

并不是

db.rename_column('accounts_transaction', 'operator', 'responsible')

但我只在 sqlite 上测试过这个(实际上根本没有 ALTER_TABLE),所以我不知道它是否真的可以在 mysql/postgres 上工作。

于 2010-10-24T16:56:21.650 回答
4

更新: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)取自 South 自动生成的迁移以保持一致性。

于 2013-03-14T17:49:40.197 回答