从dis中删除外键上的图像

2024-05-28 23:13:29 发布

您现在位置:Python中文网/ 问答频道 /正文

型号.py:

class Car(models.Model):
    ...

class Pictures(models.Model):
    car = models.ForeignKey(Car, related_name='pictures')
    width = models.PositiveIntegerField(editable=False, default=780)
    height = models.PositiveIntegerField(editable=False, default=585)
    image = models.ImageField(upload_to = get_file_path, max_length=64, height_field='height', width_field='width')

    def __unicode__(self):
        return str(self.id)

    def delete(self, *args, **kwargs): 
        storage, path = self.image.storage, self.image.path
        super(Pictures, self).delete(*args, **kwargs)
        storage.delete(path)

它工作得很好(我从管理面板中删除一张图片,这张图片会自动从磁盘中删除)。你知道吗

但当我通过管理面板删除汽车对象时,图像并没有从磁盘中删除。你知道吗

怎么解决?你知道吗

谢谢!你知道吗


Tags: pathimageselffalsemodelmodelsstoragedelete
2条回答

我开始研究这个,发现了一些关于管理和删除对象的有趣的事情。你知道吗

当从admin中删除对象时,将调用以下函数:

django/承包商/管理员/选项.py->;删除模型()

它依次调用obj.delete(),obj是被删除的当前对象。你知道吗

然后,对象的delete方法运行以下代码

collector = Collector(using=using)
collector.collect([self])
collector.delete()

收集器对象现在有一个包含所有相关对象的属性'data'。 当collector.delete()运行时,它执行函数query.delete_batch(pk_list, self.using),该函数使用参数pk\u list进行批量删除,pk\u list是要删除的相关对象的主键列表。批量删除函数不调用被删除的每个相关对象的delete方法。你知道吗

这里的好处是所有相关对象都会调用pre\u save和post\u save信号,因此我们可以将您的自定义删除代码移动到Pictures模型的pre\u save或post\u save信号中。你知道吗

我在想这应该行得通,但我还没有机会测试。你知道吗

我确信这里的问题是ORM使用ON DELETE CASCADE让数据库句柄删除关系,这意味着delete方法不会被调用。你知道吗

你可以用你在这里使用的方法来做:

class Car(models.Model):
    ...

    def delete(self, *args, **kwargs): 
        for picture in self.pictures.all():
            storage, path = picture.image.storage, picture.image.path
            storage.delete(path)
        super(Car, self).delete(*args, **kwargs)

但是,最好使用信号,而不是重写delete方法https://docs.djangoproject.com/en/dev/ref/signals/#post-delete

Note that the delete() method for an object is not necessarily called when deleting objects in bulk using a QuerySet. To ensure customized delete logic gets executed, you can use pre_delete and/or post_delete signals.

相关问题 更多 >

    热门问题