7

我在 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在管理站点中删除 an 时,我希望ImageRepresentation与它关联的 s 也Image将被删除,并且将其Folder封闭Image起来。

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

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

4

2 回答 2

16

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

一个简单的解决方案是包含on_delete=models.SET_NULL到模型的每个ForeignKeytoImage字段中,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, ...)
于 2017-05-13T13:53:12.243 回答
6

创建ForeignKey时,删除父对象时删除的内容由参数on_delete控制

默认情况下,on_delete设置为models.CASCADE,这将在删除父对象时删除子对象。没有其他配置选项可以创建您在此处报告的行为。

你有ForeignkeyFolderImageImageRepresentation吗?(在您的情况下是文件夹缩略图)

于 2012-12-06T16:42:59.240 回答