2011-05-30 98 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)。檢查您的數據庫操作流程並將其設爲父級--->子

相關問題