我想知道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是否像这样工作?
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()