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

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()

但是,窗体 View 本身没有。当我尝试保存指向AffiliateLead的消息时,它将引发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`))')

尽管事实上 View 只是采用表单,创建并保存AffiliateLead,然后创建并(尝试)保存Message,但事实并非如此。实际上,当引发此错误时,我可以进入MySQL并查看新创建的线索。当我在保存之前立即从数据库中重新获取销售线索时,它甚至在 View 中抛出此错误:
af_lead = AffiliateLead.objects.get(id = af_lead.id)
msg.lead = af_lead
msg.save()

最后,如果我立即刷新(重新提交表单),则它可以工作。没有IntegrityError。如果我让Django打印出它正在执行的SQL,我确实可以看到它在尝试插入消息之前正在插入AffiliateLead,并且消息INSERT使用了正确的AffiliateLead ID。在这一点上,我真的很沮丧。我什至尝试了手动事务处理都无济于事。

最佳答案

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

关于mysql - MySQL : #1452的奇数IntegrityError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4681973/

10-09 04:09