我在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
上添加三个外键(缩略图图像)...我完全忽略了那些(显然)。诚实没有其他关系。
答案 0 :(得分:7)
正如托马斯所说,on_delete
的默认ForeignKey
行为是models.CASCADE
。暗示着孩子'当父母'父母'模型被删除。
一个简单的解决方案是将on_delete=models.SET_NULL
包含在ForeignKey
模型的每个Image
到Folder
字段中,如下所示:
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
,删除父项时将删除子对象。其他任何配置选项都不能创建您在此处报告的行为。
您有Foreignkey
到Folder
或Image
的{{1}}吗? (在你的情况下文件夹缩略图)