Django - 在admin中删除FK时的方法调用

时间:2011-07-22 21:03:15

标签: django django-models django-admin

我的模特:

class Spectacle(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100 unique=False)
    description = models.TextField()

class SpectacleGallery(models.Model):
    spectacle = models.ForeignKey(Spectacle)
    image = models.ImageField(upload_to=upload_path_handler, max_length=255, help_text=_(u'tylko pliki z rozszerzeniem .jpg'))
    image_thumb = models.CharField(max_length=255, editable=False, blank=True, null=True)

    def delete(self, *args, **kwargs):
        image_thumb_abs = settings.MEDIA_ROOT + str(self.image_thumb)
        # try to delete thumb and image
        try:
            remove(image_thumb_abs)
        except Exception:
            pass

        try:
            self.image.delete()
        except Exception:
            pass

        super(SpectacleGallery, self).delete(*args, **kwargs) # Call the "real" delete() method.

        #try to delete dir
        try:
            removedirs(settings.SPECTACLE_GALLERY_UPLOAD_PATH + str(self.spectacle_id))
        except:
            pass

现在在管理员中,当我从SpectacleGallery文件中删除时,正在从磁盘和数据库中正确删除。问题是当我想删除Spectacle时。删除页面询问我是否确定删除了Spectacle和所有相关图像。我确认并且:删除了数据库中的所有记录。不幸的是,SpectacleGallery中的文件不会被删除。我将打印粘贴到SpectacleGallery中的delete()方法中。什么都没有显示,所以我的问题是: 为什么删除方法在以这种方式删除时不会被调用?

1 个答案:

答案 0 :(得分:0)

我的猜测是,它与批量删除项目时类似。 Django以更有效的方式执行不同类型的查询,而不是查看每个相关项并在模型上调用delete。

(在此解释:https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/