Django“无法添加或更新子行: 外键约束失败”

我有一个模型 Coupon,和一个模型 Photo与它的 ForeignKey:

class Photo(models.Model):
coupon = models.ForeignKey(Coupon,
related_name='description_photos')
title = models.CharField(max_length=100)
image = models.ImageField(upload_to='images')

我在管理中设置了内联,所以现在我可以添加照片到管理员的优惠券。

我尝试添加一个,上传成功,但是我得到了 Django 的调试页面,出现了这个错误:

IntegrityError at /admin/coupon/coupon/321/
(1452, 'Cannot add or update a child row: a foreign key constraint fails (`my_project`.`coupon_photo`, CONSTRAINT `coupon_id_refs_id_90d7f06` FOREIGN KEY (`coupon_id`) REFERENCES `coupon_coupon` (`id`))')

这是什么? 我怎样才能解决这个问题?

(如果需要的话,这是一个 MySQL 数据库。)

编辑: 我在一个 Sqlite3数据库上试了一下,它有一个稍微不同的数据集,并且它工作了,所以也许在我当前的数据库中有松散的数据?我怎样才能找到并删除它?

31350 次浏览

我的一些表在 InnoDB 中,一些在 MyISAM 中... 我将所有内容都更改为 MyISAM,问题就解决了。

为了避免这种情况发生,您还可以在 setings.py 中设置 STORAGE_ENGINE

对于 django > = 1.2

DATABASES = {
'default': {
...
'STORAGE_ENGINE': 'MyISAM / INNODB / ETC'
}
}

对于 django < = 1.2

DATABASE_STORAGE_ENGINE = "MyISAM / INNODB / ETC"

请注意,这只对 MySQL 有效

DATABASES = {
'default': {
...
'OPTIONS': {
"init_command": "SET foreign_key_checks = 0;",
},
}
}

(根据官方文件) 在 Django 的早期版本中,当使用 InnoDB 存储引擎时,具有前向引用的 fixture (即与尚未插入到数据库中的行的关系)将无法加载。这是因为 InnoDB 偏离了 SQL 标准,它立即检查外键约束,而不是将检查推迟到事务提交之后。在 Django 1.4中已经解决了这个问题。

我遇到了同样的问题: mmrs151的解决方案可以工作,但是对于 Django <= 1.2(在支持多个数据库之前的 也就是说。) ,注意的设置如下:

DATABASE_OPTIONS = {"init_command": "SET foreign_key_checks = 0;"}

值得注意的是,Ram Rachum 似乎是绕过而不是解决了这个问题: MyISAM 根本不支持事务... ..。

另一个选项是删除 MySQL 表中的约束:

alter table <TABLE_NAME> drop foreign key <CONTRAINT_NAME>;

有时出现此错误的原因是试图先保存子表,然后再保存父表。
解决这个问题的方法是使用

DATABASES = {
'default': {
...
'OPTIONS': {
"init_command": "SET foreign_key_checks = 0;",
},
}
}

2)检查数据库操作流程,使其为 parent ---> child