django - 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 在这种情况下是否会这样工作?
解决方案
CASCADE 不是那样工作的。在您的情况下,对于 CASCADE,有两个项目 A 和 B,一个作业 J_DAILY 链接到这两个项目,如果您删除项目 A,那么 J_DAILY 也将被删除。
如果你想让你的工作“活到最后一个项目”。您应该更改您的on_delete
toDO_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()
推荐阅读
- c# - 我应该为我的 .Net Core Web 应用程序使用 IMemoryCache 还是自定义 GlobalCache?
- amazon-web-services - S3 需要哪些权限才能允许部署到 AWS Amplify
- java - 运行 60 秒后发生 504 网关超时错误
- docker - 在 Linux 容器中为 ASP.NET Core 安装字体
- microsoft-teams - 团队日历请求导致 Exchange Server 2016 记录未处理的异常 (maxQueryStringLength)
- ssl - 通过 HTTPS 通过其 IP 使用 Python 请求访问主机时出现问题
- sql - Teradata SQL - 请查看正文并为我提供解决方案的逻辑
- excel - 从 FormUser 粘贴代码后,如何删除输入符号小方块?
- typescript - 工件注册表文件中的“自述文件”字段来自哪里
- flutter - Flutter ListView Builder 滚动整个屏幕