首页 > 解决方案 > CASCADE 究竟是如何与 Django 中的多对多字段一起工作的

问题描述

我想知道 CASCADE 究竟如何与 Django 中的 ManyToMany 字段一起工作。

一个简短的例子:

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

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

如您所见,我在这里有一个 ManyToManyField。所以基本上一个项目可以有多个工作,一个工作可以属于多个不同的项目。我想要的是只有当它所属的所有项目都被删除时才会自动删除作业。CASCADE 在这种情况下是否会这样工作?

标签: djangodjango-modelscascade

解决方案


CASCADE 不是那样工作的。在您的情况下,对于 CASCADE,有两个项目 A 和 B,一个作业 J_DAILY 链接到这两个项目,如果您删除项目 A,那么 J_DAILY 也将被删除。

如果你想让你的工作“活到最后一个项目”。您应该更改您的on_deletetoDO_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()

推荐阅读