首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django -将ForeignKey关系更改为OneToOne

Django -将ForeignKey关系更改为OneToOne
EN

Stack Overflow用户
提问于 2011-09-08 07:50:17
回答 2查看 5.8K关注 0票数 19

我正在使用我的Django应用程序的South。我有两个模型,我正在将它们从具有ForeignKey关系更改为具有OneToOneField关系。当我在我的dev数据库上运行这个迁移时,它运行得很好。当迁移作为创建测试数据库的一部分运行时,最新的迁移失败并显示MySQL 1005错误:"Can't create table mydb.#sql-3249_1d (errno: 121)“。谷歌搜索显示,这通常是试图添加与现有约束具有相同名称的约束时出现的问题。在迁移中失败的特定行是:

关系已从以下位置更改:

代码语言:javascript
复制
class MyModel(models.Model):
    othermodel = models.ForeignKey(OtherModel)

代码语言:javascript
复制
class MyModel(models.Model):
    othermodel = models.OneToOneField(OtherModel)

它在迁移过程中生成了以下语句:

代码语言:javascript
复制
db.alter_column('myapp_mymodel', 'othermodel_id', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['myapp.OtherModel'], unique=True))

db.create_unique('myapp_mymodel', ['othermodel_id'])

但是,它在alter_column调用上失败,而不是在create_unique调用上失败。我运行以下命令来查看生成了什么SQL:

代码语言:javascript
复制
python manage.py migrate myapp 0010 --db-dry-run --verbosity=2

它被打印出来

代码语言:javascript
复制
myapp:0010_auto__chg_field_mymodel_othermodel__add_unique_mymodel
   = ALTER TABLE `myapp_mymodel` ADD CONSTRAINT `myapp_mymodel_othermodel_id_uniq` UNIQUE (`othermodel_id`) []
   = SET FOREIGN_KEY_CHECKS=1; []
   = ALTER TABLE `myapp_mymodel` ADD CONSTRAINT `myapp_mymodel_othermodel_id_uniq` UNIQUE (`othermodel_id`) []

它尝试运行ADD CONSTRAINT两次似乎很奇怪,但是如果我删除了db.create_unique调用,当我用--db-dry-run运行它时不会生成任何SQL,但是如果我真的运行它,我仍然会得到错误。

我在这里很困惑,任何帮助都很感谢。

EN

回答 2

Stack Overflow用户

发布于 2011-11-26 18:57:13

您实际上根本不需要迁移。OneToOne和ForeignKey关系在钩子下有一个兼容的数据库模式:一个简单的列,其中一个表中有另一个对象ID。

如果您不想让south忽略此更改,那么只需使用migrate --fake伪造迁移即可。

票数 13
EN

Stack Overflow用户

发布于 2013-09-27 01:53:25

我同意@e-satis的观点,这里的目标是假装迁移,但如果你是在团队中工作,我建议使用一种不同的方法。

如果您创建了一个迁移,然后对其执行--fake操作,则您的所有团队成员都需要记住对其执行--fake操作。如果他们中的任何一个在升级时没有这样做,你就有麻烦了。

更好的方法是创建一个空迁移,然后迁移它:

代码语言:javascript
复制
manage.py schemamigration yourapp --empty fake_migration_of_foreign_key_to_onetoone
manage.py migrate  # Like you always do! 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7341722

复制
相关文章

相似问题

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