如何阻止Django中的级联删除?

时间:2012-12-06 16:18:45

标签: python database django model

我在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时,我希望同时删除与ImageRepresentation相关联的Image,以及{{1将那个Folder封闭起来。

管理网站告诉我,封闭的Image也将被删除。我该怎么做才能获得理想的行为?我查看了删除级联规则,但我尝试的任何内容似乎都没有用。

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

2 个答案:

答案 0 :(得分:7)

正如托马斯所说,on_delete的默认ForeignKey行为是models.CASCADE。暗示着孩子'当父母'父母'模型被删除。

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

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, ...)

答案 1 :(得分:3)

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

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

您有ForeignkeyFolderImage的{​​{1}}吗? (在你的情况下文件夹缩略图)