Подтвердить что ты не робот

Odd IntegrityError для MySQL: # 1452

Это нечто странное, но я постараюсь объяснить, насколько это возможно. У меня есть 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. Я на самом деле в тупике. Я даже попробовал ручную обработку транзакций безрезультатно.

4b9b3361

Ответ 1

Я не совсем уверен, почему это произошло, но я действительно нашел решение. Я использую Юг для управления БД; он создал сообщения как InnoDB и AffiliateLead как MyISAM. Изменение таблицы AffiliateLead в InnoDB завершило IntegrityErrors. Надеюсь, это поможет кому-то еще.