Как именно CASCADE работает с полями ManyToMany в Django - PullRequest
0 голосов
/ 25 апреля 2020

Мне интересно, как именно CASCADE работает с полями ManyToMany в Django.

Краткий пример:

class Project(Model):
    name = TextField(null=False)

class Job(Model):
    projects = ManyToManyField(Project, on_delete=CASCADE, null=False)
    name = TextField(null=False)

Как вы видите, у меня есть поле ManyToManyField. Таким образом, в основном проект может иметь несколько заданий, а задание может принадлежать нескольким различным проектам. Я хочу, чтобы работа автоматически удалялась только тогда, когда все проекты, к которым она принадлежит, были удалены. Работает ли CASCADE таким образом в этом сценарии?

1 Ответ

0 голосов
/ 26 апреля 2020

CASCADE не работает так. В вашем случае, с CASCADE, с двумя проектами A и B, задание J_DAILY, связанное с обоими проектами, если вы удалите проект A, то J_DAILY также будет удалено.

Если вы хотите, чтобы ваша работа "дожила до его последний проект ". Вам следует изменить on_delete на DO_NOTHING и добавить проверку на удаление проектов.

@receiver(pre_delete, sender=Project)
def delete_related_jobs(sender, instance, **kwargs):
    for job in instance.job_set.all():
        # No remaining projects
        if not job.projects.exclude(id=instance.id).count():
               job.delete()
...