Ошибка целостности на DRF при разрушении приспособления
У меня есть эти 2 модели в Django:
class Invoice(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
owner = models.ForeignKey(to="User", on_delete=models.CASCADE)
client = models.ForeignKey(to=Client, on_delete=models.CASCADE)
project = models.ForeignKey(to=Project, on_delete=models.CASCADE)
work_sessions = models.ManyToManyField (WorkSession)
fixed_travels = models.ManyToManyField(FixedTravel)
hourly_travels = models.ManyToManyField(HourlyTravel)
class WorkSession(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
start_timestamp = models.IntegerField(editable=True, null=False, blank=False)
end_timestamp = models.IntegerField(editable=True, null=False, blank=False)
project = models.ForeignKey(to=Project, on_delete=models.CASCADE)
owner = models.ForeignKey(
to="User", related_name="work_sessions", on_delete=models.CASCADE
)
Я нахожусь в середине APITestCase в Django Rest Framework, где я создаю 2 рабочие сессии и один счет и назначаю эти сессии счету
Теперь при разрушении приспособления возникает исключение
raise IntegrityError(
django.db.utils.IntegrityError: The row in table 'drscm_invoice_work_sessions' with primary key '1' has an invalid foreign key: drscm_invoice_work_sessions.invoice_id contains a value '13ba348db35746c1b7f56884efc6249a' that does not have a corresponding value in drscm_invoice.id.
Я хочу, чтобы WorkSession существовал, даже если счет-фактура будет удален. И это не отношения ManyToOne, которые я ищу :/
Что я делаю не так?
Если рабочая сессия должна быть связана только с одним счетом-фактурой, измените свои модели следующим образом
class Invoice(models.Model):
....
work_sessions = models.OneToOne(to=WorkSession, on_delete=models.SET_NULL, null=True, blank=True, related_name="inv_workssessions")
или для прикрепления нескольких счетов-фактур к рабочей сессии используйте отношения ForeignKey аналогично.
on_delete=models.CASCADE удаляет все связанные объекты при удалении родительского объекта. on_delete=models.SET_NULL просто удалит связь по внешнему ключу и сохранит строку.
Вы также можете проверить другие доступные варианты здесь в официальной документации.