Используйте разное поведение удаления в admin-django и models.CASCADE

У меня есть две модели Django, одна ссылается на другую с помощью ForeignKey. Что-то вроде этого:

class Data(models.Model):
   [some fields]

class Backup(models.Model):
   data_source = models.ForeignKey(Data, on_delete=models.CASCADE)
   storage_destination = models.ForeginKey(S3Bucket, on_delete=models.CASCADE)

Я хочу, чтобы после удаления экземпляра "Data" его резервные копии удалялись из ведра S3 (я могу сделать это, вызвав Temporal workflow, например, DeleteFromS3Workflow, никакого хака Django не требуется), а после завершения DeleteFromS3Workflow модель "Backup" удалялась из базы данных. Помимо этого, я хочу иметь возможность удалить объект "Backup" из Django admin без вызова Temporal workflow и прямого удаления объекта из базы данных (то, что делает ненастроенный метод delete() модели). Перезапись метода delete() на модели "Backup" не удовлетворяет этому, пока она удаляет модель до завершения рабочего процесса, и такое поведение является взаимным в обоих случаях.

Вы можете написать свою собственную пользовательскую функцию on_delete, которая повторяет функцию CASCADE, но добавляет ваше удаление S3. Таким образом, вы можете сохранить стандартную функцию delete() вашей модели, чтобы она работала как обычно в админке Django.

data_source = models.ForeignKey(Data, on_delete=CASCADE_S3_WORKFLOW)

Если вы посмотрите на исходный код Django , то увидите, что делает CASCADE:

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