如何阻止这种级联删除在 Django 中发生?

Posted

技术标签:

【中文标题】如何阻止这种级联删除在 Django 中发生?【英文标题】:How do I stop this cascading delete from happening in Django? 【发布时间】:2012-11-24 17:37:06 【问题描述】:

我在 Django 应用中有三个模型类:

class Folder(models.Model):
  ...
  folder = models.ForeignKey('Folder',null=True,blank=True,related_name='folders')
  front_thumbnail_image = models.ForeignKey('Image',verbose_name='Front Thumbnail',null=True,blank=True,related_name='front_thumbnail_for_folders')
  middle_thumbnail_image = models.ForeignKey('Image',verbose_name='Middle Thumbnail',null=True,blank=True,related_name='middle_thumbnail_for_folders')
  back_thumbnail_image = models.ForeignKey('Image',verbose_name='Back Thumbnail',null=True,blank=True,related_name='back_thumbnail_for_folders')

class Image(models.Model):
  ...
  folder = models.ForeignKey(Folder,related_name='images',null=True)

class ImageRepresentation(models.Model):
  ...
  image = models.ForeignKey(Image, related_name="image_representations")

鉴于此模型,当我在管理站点中删除 Image 时,我希望与该 Image 关联的 ImageRepresentations 也将被删除,并且包含 ImageFolder 将被删除一个人呆着。

管理站点告诉我封闭的Folder 也将被删除。我该怎么做才能获得所需的行为?我查看了删除级联规则,但我尝试的任何方法似乎都不起作用。

编辑Folder(缩略图)上添加三个外键......我完全忽略了那些(显然)。老实说,没有其他关系。

【问题讨论】:

这不应该发生。你有从FolderImageImageRepresentationForeignkey 吗? 你完全正确。我不敢相信我忽略了这一点。 @ThomasOrozco 如果您想提供明显的答案,我会将其标记为正确的。 【参考方案1】:

创建ForeignKey 时,删除父对象时删除的内容由the on_delete parameter 控制。

默认情况下,on_delete 设置为models.CASCADE,在删除父对象时会删除子对象。其他任何配置选项都无法创建您在此处报告的行为。

您是否有从FolderImageImageRepresentationForeignkey? (在您的情况下为文件夹缩略图)

【讨论】:

@HiltonCampbell 有时你需要有人指出显而易见的事情:) 不再使用 django 2.0。 On_delete 不再是可选参数【参考方案2】:

正如 Thomas 所说,ForeignKey 的默认 on_delete 行为是 models.CASCADE。暗示删除“父”模型时将删除“子”模型。

一个简单的解决方案是将on_delete=models.SET_NULL 包含到Folder 模型的每个ForeignKeyImage 字段中,如下所示:

front_thumbnail_image  = models.ForeignKey('Image',on_delete=models.SET_NULL, null=True, ...)
middle_thumbnail_image = models.ForeignKey('Image',on_delete=models.SET_NULL, null=True, ...)
back_thumbnail_image   = models.ForeignKey('Image',on_delete=models.SET_NULL, null=True, ...)

【讨论】:

以上是关于如何阻止这种级联删除在 Django 中发生?的主要内容,如果未能解决你的问题,请参考以下文章

python django中的orm外键级联删除

如何检查 Django 中将级联删除的对象?

如何在 EF 代码优先中禁用链接表的级联删除?

如何使用不会将删除级联到其子级的 ForeignKeys 创建 Django 模型?

为啥 Django 模型级联删除在现实世界中会失败?

Django,级联移动到单独的表而不是级联删除