Django — Ограничение внешнего ключа не удается удалить с помощью сквозной модели

#mysql #django

Вопрос:

Я работаю над API REST с использованием Django Rest, и одна конечная точка включает удаление модели контактов, с которой может быть связано несколько адресов через ContactAddress через модель.

Модель контакта выглядит следующим образом:

 class Contact(AuditModel):  contact_id = models.AutoField(primary_key=True)  address = models.ManyToManyField('Address', through='ContactAddress')  name_first = models.CharField(max_length=100)  name_last = models.CharField(max_length=100)  

Контактный адрес выглядит так:

 class ContactAddress(models.Model):  contact = models.ForeignKey('Contact', on_delete=models.CASCADE)  address = models.ForeignKey('Address', on_delete=models.CASCADE)  is_billing = models.BooleanField(null=True, default=False)  is_shipping = models.BooleanField(null=True, default=False)  

И модель адреса выглядит так:

 class Address(AuditModel):  address_id = models.AutoField(primary_key=True)  postcode = models.CharField(max_length=30, blank=True, null=True)  region = models.CharField(max_length=100, blank=True, null=True)  street_line_1 = models.CharField(max_length=500, blank=True, null=True)  street_line_2 = models.CharField(max_length=500, blank=True, null=True)  street_line_3 = models.CharField(max_length=500, blank=True, null=True)  

И при попытке удалить контакт подобным образом с contact.delete() помощью я получаю следующую ошибку MySQL:

 django.db.utils.IntegrityError: (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`mnghub`.`contact_addresses`, CONSTRAINT `contact_addresses_contact_id_cadc11a0_fk_contacts_contact_id` FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`contact_id`))')  

Я получаю эту ошибку, несмотря на то, что у контакта нет связанных с ним адресов. Я предполагаю, что ограничение связано с тем, что связь «многие ко многим», но я хочу иметь возможность удалять связанные модели, если они связаны только с одним объектом

Комментарии:

1. Я почти уверен, что вы получаете эту ошибку, если у данного контакта есть хотя бы один связанный адрес. Внешние ключи не блокируют удаление родительских записей, у которых нет дочерних записей.

2.У контакта нет адресов или адресов контактов, связанных с ним, но я все равно получаю ошибку. Я запустил это в оболочку: gt;gt;gt; contact.address.all() lt;QuerySet []gt; gt;gt;gt; contact.contactaddress_set.all() lt;QuerySet []gt; gt;gt;gt; contact.delete() Traceback (most recent call last): «