python - 从磁盘中删除外键上的图像

标签 python django

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

效果很好(我从管理面板中删除了一张图片,这张图片会自动从磁盘中删除)。

但是当我通过管理面板删除汽车对象时,图像不会从磁盘中删除。

如何解决这个问题?

谢谢!

最佳答案

我确信这里的问题是 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.

关于python - 从磁盘中删除外键上的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27043856/

相关文章:

python - 如何使用 PyArrow 从 s3 读取定义的 Parquet 文件列表?

Django Rest Framework 在 get_queryset 方法中过滤对象

python - GAE : ImportError while using google-auth

python - 当某些行返回该相关对象的空值时,如何使用 select_lated() ?

python - 变分自动编码器实现

python - 属性错误: 'GqlQuery' object has no attribute 'Key'

python - TypeError : list indices must be integers or slices, not str when parsing lists

python - 在 DRF 中测试 throttle 的正确方法是什么?

jquery - 使用 FormData 与 form.serialize() 与 django 进行 ajax 发帖

python - 如何在 Windows 64 位上安装 ImageMagick 和 Anaconda?