如何阻止这种级联删除在 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
关联的 ImageRepresentation
s 也将被删除,并且包含 Image
的 Folder
将被删除一个人呆着。
管理站点告诉我封闭的Folder
也将被删除。我该怎么做才能获得所需的行为?我查看了删除级联规则,但我尝试的任何方法似乎都不起作用。
编辑在Folder
(缩略图)上添加三个外键......我完全忽略了那些(显然)。老实说,没有其他关系。
【问题讨论】:
这不应该发生。你有从Folder
到Image
或ImageRepresentation
的Foreignkey
吗?
你完全正确。我不敢相信我忽略了这一点。
@ThomasOrozco 如果您想提供明显的答案,我会将其标记为正确的。
【参考方案1】:
创建ForeignKey
时,删除父对象时删除的内容由the on_delete
parameter 控制。
默认情况下,on_delete
设置为models.CASCADE
,在删除父对象时会删除子对象。其他任何配置选项都无法创建您在此处报告的行为。
您是否有从Folder
到Image
或ImageRepresentation
的Foreignkey
? (在您的情况下为文件夹缩略图)
【讨论】:
@HiltonCampbell 有时你需要有人指出显而易见的事情:) 不再使用 django 2.0。 On_delete 不再是可选参数【参考方案2】:正如 Thomas 所说,ForeignKey
的默认 on_delete
行为是 models.CASCADE
。暗示删除“父”模型时将删除“子”模型。
一个简单的解决方案是将on_delete=models.SET_NULL
包含到Folder
模型的每个ForeignKey
到Image
字段中,如下所示:
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 中发生?的主要内容,如果未能解决你的问题,请参考以下文章