2011-05-30 100 views
60

我有一个模型Coupon,并用ForeignKey模型Photo它:的Django“不能添加或更新子行,外键约束失败”

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数据库,和它的工作,所以也许有一个在我目前的松散数据D B?我如何找到并删除它?

+0

从优惠券到照片有关系吗? – Hgeg 2011-05-30 18:15:14

+0

不。[这些字符是为了满足StackOverflow而添加的。] – 2011-05-30 18:20:05

+0

我发现南部创建了一个新表作为innodb,但是我所有其他表都是myisam。大声笑,下次会知道;) – rix 2014-04-08 16:43:05

回答

83

我的一些表在InnoDB中,有些在MyISAM中......我把所有东西都改成了MyISAM,问题就解决了。

+3

啊!因为这个错误,我的一个小时的生活浪费了...而且因为没有及时找到答案。谢谢! – webjunkie 2012-06-25 15:55:26

+12

+1,因为我*从未*会想到我自己。 – 2012-07-17 23:54:21

+0

这也发生在我身上!但是---为什么有些是用MyISAM和其他InnoDB创建的,我仍然不知所措。你知道这会发生吗? – jkeesh 2013-03-11 21:37:24

19

为了避免这种情况发生你也可以做的是设置你的STORAGE_ENGINE在你的settings.py

Django的> = 1.2

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

Django的< = 1.2

DATABASE_STORAGE_ENGINE = "MyISAM/INNODB/ETC" 

请注意,这仅适用于MySQL

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

According to the official doc) 在以前的Django版本中,具有前向引用的灯具(即,关系到尚未插入到数据库中的行)在使用InnoDB存储引擎时将无法加载。这是由于InnoDB偏离了SQL标准,因为它立即检查外键约束,而不是延迟检查直到事务提交。这个问题已经在Django 1.4中解决了。

+4

这就是答案:P – 2012-06-21 19:00:58

+6

非常感谢!我有这个问题,感到困惑。我使用Django 1.5与INNODB和南,我不想手改变架构的东西! – JREAM 2013-08-09 15:40:43

+0

这真的很奇怪。我有同样的错误,但只有在运行测试时,我正在使用Django 1.8。 – Sardathrion 2015-08-14 06:53:25

4

我遇到了同样的问题:mmrs151的解决方案工作,但NB,对于Django <= 1.2之前多数据库支持),设置如下:

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

值得一提的是,拉姆Rachum似乎已经解决了问题而不是解决了这个问题:MyISAM根本不支持事务...

-2

另一个选择是放弃您的MySQL表中的约束:

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

有时出现此错误的原因是先尝试保存子表,然后保存父表。
对此的解决方案是使用
1)。 DATABASES = { 'default': { ...
'OPTIONS': { "init_command": "SET foreign_key_checks = 0;", }, } }

2)。检查您的数据库操作流程并将其设为父级--->子

相关问题