#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):
«