Это нечто странное, но я постараюсь объяснить, насколько это возможно. У меня есть 2 модели: одна представляет сообщение электронной почты (Сообщение), другая - лидер по продажам (AffiliateLead). Когда форма отправляется через сайт, система генерирует лидирующие позиции, а затем электронную почту. Модель сообщения имеет дополнительный FK для Lead. Из файла моделей сообщений:
lead = models.ForeignKey('tracking.AffiliateLead', blank=True, null=True)
Теперь эта базовая оболочка работает:
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 и увидеть вновь созданный список. Он даже выбрасывает эту ошибку в представлении, когда я снова извлекаю вывод из базы данных непосредственно перед сохранением:
af_lead = AffiliateLead.objects.get(id = af_lead.id)
msg.lead = af_lead
msg.save()
Наконец, если я немедленно обновляю (повторно отправляю форму), он работает. Нет IntegrityError. Если у меня есть Django, распечатайте SQL, который он делает, я действительно вижу, что это INSERTing AffiliateLead, прежде чем он попытается ВСТАВИТЬ сообщение, а Message INSERT использует правильный идентификатор AffiliateLead. Я на самом деле в тупике. Я даже попробовал ручную обработку транзакций безрезультатно.