2011-01-13 74 views
11

這是一個奇怪的,但我會盡我所能解釋。我有兩種模式:一種代表電子郵件(消息),另一種代表銷售負責人(AffiliateLead)。當通過網站提交表格時,系統會生成一個表格併發送電子郵件。消息模型有一個可選的FK返回到潛在客戶。從消息模型文件:MySQL上的奇怪IntegrityError:#1452

lead = models.ForeignKey('tracking.AffiliateLead', blank=True, null=True) 

現在,這個基本的shell工作:

from tracking.models import Affiliate, AffiliateLead 
from messages.models import Message 
from django.contrib.auth.models import User 

u = User.objects.get(username='testguy') 
a = Affiliate.objects.get(affiliate_id = 'ACD023') 
l = AffiliateLead(affiliate = a) 
l.save() 
m = Message(recipient=u, sender=u, subject='s', body='a', lead=l) 
m.save() 

然而,表單視圖本身不。它拋出一個IntegrityError當我嘗試保存一個指向AffiliateLead消息:

(1452, 'Cannot add or update a child row: a foreign key constraint fails (`app`.`messages_message`, CONSTRAINT `lead_id_refs_id_6bc546751c1f96` FOREIGN KEY (`lead_id`) REFERENCES `tracking_affiliatelead` (`id`))') 

儘管這是一個事實,即視圖採取簡單的形式,創建和保存AffiliateLead,然後創建和(試圖)保存消息。事實上,當這個錯誤被拋出時,我可以進入MySQL並看到新創建的線索。它甚至全中,針對這一錯誤,立即在保存前,當我重新找回從DB鉛:

af_lead = AffiliateLead.objects.get(id = af_lead.id) 
msg.lead = af_lead 
msg.save() 

最後,如果我立即刷新(重新提交表單),它的工作原理。沒有完整性錯誤。如果我讓Django打印出它正在執行的SQL,我確實可以看到它在嘗試插入消息之前插入AffiliateLead,並且消息INSERT正在使用正確的AffiliateLead ID。我真的很難在這一點上。我甚至嘗試過手動的事務處理無濟於事。

回答

13

我不完全確定它爲什麼發生,但我似乎找到了解決方案。我使用South來管理數據庫;它將InnoDB和AffiliateLead創建爲MyISAM。將AffiliateLead表更改爲InnoDB結束了IntegrityErrors。希望這可以幫助別人。

+0

謝謝,這有助於。這正是我所看到的。最近升級了我的電腦,我猜想mysql現在默認爲InnoDB,因爲它曾經是MyISAM,所以這是非常令人驚訝的行爲。 – 2011-05-21 15:50:28