首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用南方重命名一个外键字段?

如何用南方重命名一个外键字段?
EN

Stack Overflow用户
提问于 2010-08-14 21:23:54
回答 4查看 5.7K关注 0票数 13

重命名一个简单的charfield等似乎很容易(Django - How to rename a model field using South?)

然而,当我尝试在ForeignKey字段上使用相同的内容时,我会得到一个错误:

代码语言:javascript
运行
复制
_mysql_exceptions.OperationalError: (1091, "Can't DROP '[new_fkey_field_name]'; check that column/key exists")

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

有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-14 17:49:40

更新:使用mysql-5.5.30-1.fc18.x86_64

代码语言:javascript
运行
复制
MySQL-python==1.2.4
Django==1.4.2
South==0.7.6

以下工作:

代码语言:javascript
运行
复制
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)取自南方自动生成的迁移,以保持一致性。

票数 4
EN

Stack Overflow用户

发布于 2011-07-21 09:24:55

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

然后,您需要删除fk约束并在重命名之后重新创建它们:

代码语言:javascript
运行
复制
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是可空的,则需要使用将其更改为:

代码语言:javascript
运行
复制
db.alter_column('app_model', 'new_id', models.ForeignKey(null=True, to=orm['app.OtherModel']))
票数 24
EN

Stack Overflow用户

发布于 2011-07-26 17:19:44

如果MySQL用户确实仍然适用,那么南方的用户应该知道这个错误:

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

解决办法是分三个步骤进行迁移:

1)添加新字段

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

3)删除旧字段

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3485176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档