【问题标题】:Can't migrate Django models with foreign key constraints无法迁移具有外键约束的 Django 模型
【发布时间】:2015-05-25 14:07:56
【问题描述】:

我有一个带有外键字段的模型。我想删除外键引用。但是,由于以下错误,迁移失败:

Cannot delete or update a parent row: a foreign key constraint fails

我了解发生了什么,但我不知道如何使用 Django 正确解决此问题。现在(因为我处于项目的开始阶段),我手动进入 MySQL 数据库并删除表并重新迁移,就好像它是第一次迁移一样。

有没有办法使用 Django 来解决这个外键约束问题?


我正在使用 Django 1.7
数据库后端是 MySQL

编辑 - 迁移之前/之后的模型

之前

class Skills(models.Model):
  # fields here...

class Project(models.Model):
  skills = models.ForeignKey(Skills, verbose_name = "Required Skills", blank = True, null = True)

之后

class Skill(models.Model):
  # fields here...

class Project(models.Model):
  skills = models.ForeignKey(Skill, verbose_name = "Required Skills", blank = True, null = True)

我很确定我所做的只是从 Skill 模型中删除了“复数”。 makemigrations 命令工作正常,但 migrate 命令失败并出现上述错误。


编辑 2

遇到同样的错误:

Cannot drop column 'skills_id': needed in a foreign key constraint 'projects_project_skills_id_4cc7e00883ac4de2_fk_projects_skill_id'

这次我从模型Project 中删除了字段skill

【问题讨论】:

  • 这是您在删除或更新行时可能会遇到的错误;不是在您更改数据库架构时。您可以发布您的模型(迁移前后)吗?

标签: django django-migrations


【解决方案1】:

我使用的一个小技巧:

  • 添加一个迁移操作,首先将字段更改为 IntegerField,然后再进行其他操作,即

operations = [ migrations.AlterField( model_name='projects_project', name='skills', field=models.IntegerField(default=0) ), ..... other migration entries now after this. ]

【讨论】:

  • 你的 hack 对我有用。我在添加 ForeignKey 列时遇到了同样的问题。我首先使用migrations.AddField(...UUIDField...) 作为字段,然后将AlterField 放在后面。
猜你喜欢
  • 2014-05-02
  • 2019-03-24
  • 2017-03-27
  • 1970-01-01
  • 2018-05-10
  • 2021-08-30
  • 1970-01-01
  • 2012-01-05
相关资源
最近更新 更多