Django“无法添加或更新子行:外键约束失败”
我有一个模型Coupon
,以及一个带有ForeignKey
的模型Photo
:
class Photo(models.Model): coupon = models.ForeignKey(Coupon, related_name='description_photos') title = models.CharField(max_length=100) image = models.ImageField(upload_to='images')
我在pipe理员中设置内联,所以现在我可以从pipe理员添加照片到优惠券。
我试图添加一个,上传成功,但是我得到了Django的debugging页面,出现这个错误:
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数据库有一个稍微不同的数据集,它的工作,所以也许有松散的数据在我当前的数据库? 我如何find并删除它?
我的一些表在InnoDB中,有些在MyISAM中…我把所有的东西都改成了MyISAM,问题就解决了。
DATABASES = { 'default': { ... 'OPTIONS': { "init_command": "SET foreign_key_checks = 0;", }, } }
( 根据官方文档 )在以前的Django版本中,使用InnoDB存储引擎时,具有向前引用的装置(即与还没有插入到数据库中的行的关系)将无法加载。 这是由于InnoDB偏离SQL标准的缘故,通过立即检查外键约束而不是推迟检查直到事务提交。 这个问题已经在Django 1.4中解决了。
为了避免这种情况发生,你也可以在你的settings.py中设置你的STORAGE_ENGINE
为django> = 1.2
DATABASES = { 'default': { ... 'STORAGE_ENGINE': 'MyISAM / INNODB / ETC' } }
对于Django <= 1.2
DATABASE_STORAGE_ENGINE = "MyISAM / INNODB / ETC"
请注意,这只对MySQL有效
我遇到了同样的问题:mmrs151的解决scheme工作,但注意 ,对于Django <= 1.2
( 即多个数据库支持之前),设置如下所示:
DATABASE_OPTIONS = {"init_command": "SET foreign_key_checks = 0;"}
值得注意的是,Ram Rachum似乎已经解决了问题而不是解决了问题:MyISAM根本不支持事务…
有时这个错误的原因是先保存子表,然后保存父。
解决这个是用的
1)。 DATABASES = { 'default': { ...
'OPTIONS': { "init_command": "SET foreign_key_checks = 0;", }, } }
2)。 检查您的数据库操作stream程,并使其父 – >子
另一个select是放弃你的MySQL表中的限制:
alter table <TABLE_NAME> drop foreign key <CONTRAINT_NAME>;