MySQL上的Odd IntegrityError:#1452

ken*_*tor 11 mysql django django-models

这有点奇怪,但我会尽力解释.我有两个模型:一个代表电子邮件消息(消息),另一个代表销售线索(AffiliateLead).当通过网站提交表单时,系统会生成一个潜在客户,然后发送电子邮件.Message模型有一个可选的FK返回Lead.从Message模型文件:

lead = models.ForeignKey('tracking.AffiliateLead', blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

现在,这个基本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()
Run Code Online (Sandbox Code Playgroud)

但是,表单视图本身不会.当我尝试保存指向AffiliateLead的Message时,它会抛出IntegrityError:

(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`))')
Run Code Online (Sandbox Code Playgroud)

尽管视图只是采用表单,创建和保存AffiliateLead,然后创建和(尝试)保存消息.实际上,当抛出此错误时,我可以进入MySQL并查看新创建的潜在客户.当我在保存之前立即从DB重新检索线索时,它甚至会在视图中抛出此错误:

af_lead = AffiliateLead.objects.get(id = af_lead.id)
msg.lead = af_lead
msg.save()
Run Code Online (Sandbox Code Playgroud)

最后,如果我立即刷新(重新提交表单),它就可以了.没有IntegrityError.如果我让Django打印出它正在执行的SQL,我确实可以看到它在尝试INSERT消息之前插入了A​​ffiliateLead,而消息INSERT正在使用正确的AffiliateLead ID.我真的很难过.我甚至尝试过手动交易处理无济于事.

ken*_*tor 13

我不确定为什么会这样,但我似乎确实找到了解决方案.我正在使用South来管理数据库; 它创建了作为InnoDB的消息和AffiliateLead作为MyISAM.将AffiliateLead表更改为InnoDB结束了IntegrityErrors.希望这有助于其他人.