Django - 将ForeignKey关系更改为OneToOne

17 python mysql django django-south

我正在使用我的Django应用程序.我有两个模型,我正在改变与ForeignKey关系的OneToOneField关系.当我在我的dev数据库上运行此迁移时,它运行正常.当迁移作为创建测试数据库的一部分运行时,最新的迁移失败,出现MySQL 1005错误:"无法创建表mydb.#sql-3249_1d(错误号:121)".做一些谷歌搜索显示,这通常是尝试添加与现有约束具有相同名称的约束的问题.它失败的迁移中的特定行是:

关系改变自:

class MyModel(models.Model):
    othermodel = models.ForeignKey(OtherModel)
Run Code Online (Sandbox Code Playgroud)

class MyModel(models.Model):
    othermodel = models.OneToOneField(OtherModel)
Run Code Online (Sandbox Code Playgroud)

在迁移中生成以下语句:

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'])
Run Code Online (Sandbox Code Playgroud)

但是create_unique,它没有在alter_column通话中失败,而是在通话失败.我运行以下命令来查看正在生成的SQL:

python manage.py migrate myapp 0010 --db-dry-run --verbosity=2
Run Code Online (Sandbox Code Playgroud)

它打印出来了

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`) []
Run Code Online (Sandbox Code Playgroud)

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

我在这里不知所措,任何帮助表示赞赏.

e-s*_*tis 11

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

migrate --fake如果您不想进入告诉南方忽略此更改的麻烦,请假装迁移.


kat*_*lee 2

我要尝试的第一件事是db.delete_unique(...)在不同的地方添加 a ,看看我是否可以破解它。

如果做不到这一点,我会将其分为 3 个迁移:

  1. 架构迁移,为 OneToOne 添加新列
  2. 将所有 FK 值从旧列复制到新列的数据迁移
  3. 架构迁移以删除旧列,然后我手动编辑该列以包含将新列重命名为与旧列相同的命令。