Ошибка целостности на 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 просто удалит связь по внешнему ключу и сохранит строку.

Вы также можете проверить другие доступные варианты здесь в официальной документации.

Вернуться на верх