Django 如何将foreignkey字段重命名为South?

Django 如何将foreignkey字段重命名为South?,django,django-south,Django,Django South,重命名简单的charfield等似乎很容易() 但是,当我尝试在ForeignKey字段上使用相同的字段时,我得到一个错误: _mysql_exceptions.OperationalError: (1091, "Can't DROP '[new_fkey_field_name]'; check that column/key exists") 这源于出于某种原因试图向后运行的迁移(如跟踪所示) 有什么想法吗?重命名外键时,请记住在Django中使用的字段名称末尾添加\u id。例如 db.r

重命名简单的charfield等似乎很容易()

但是,当我尝试在ForeignKey字段上使用相同的字段时,我得到一个错误:

_mysql_exceptions.OperationalError: (1091, "Can't DROP '[new_fkey_field_name]'; check that column/key exists")
这源于出于某种原因试图向后运行的迁移(如跟踪所示)


有什么想法吗?

重命名
外键时,请记住在Django中使用的字段名称末尾添加
\u id
。例如

db.rename_column('accounts_transaction', 'operator_id', 'responsible_id')
而不是

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

但是我只在sqlite上测试过它(实际上根本没有ALTER_表),所以我不知道它是否能在mysql/postgres上工作。

首先,您需要使用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']))

MySQL用户应该意识到南方的这个bug,如果它仍然适用的话:

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

1) 添加新字段

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


3) 删除旧字段

更新:使用
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的自动生成迁移以确保一致性。

看起来问题出在MySql方面。-您使用了什么存储引擎?-您是否使用MyISAM(不支持引用完整性)?-您是否尝试过postgresql的sqlite?这里有类似的问题:这不适用于MySQL 5.5.13(south 0.7.3)drop_foreign_键未找到外键约束。alter_column()不应该使用“new_id”吗?如果fk可为null,则调试起来非常困难。谢谢你,我认为这应该是公认的答案。对我来说非常有效。如果你用这种溶液,你可能会被咬。无论是monkey patch South(见罚单)还是贿赂修复itIMHO,这都是唯一一个能够可靠地与MySQL DBs一起工作的解决方案