CASCADE如何与Django中的ManyToMany字段一起正常工作

问题描述 投票:0回答:1

我想知道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。因此,一个项目基本上可以具有多个Job,而一个Job可以属于多个不同的Project。我想要的是,仅在删除作业所属的所有项目时才自动删除该作业。在这种情况下,CASCADE是否像这样工作?

django django-models cascade
1个回答
0
投票

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()
© www.soinside.com 2019 - 2024. All rights reserved.