python - 删除与模型关联的文件 - django

标签 python django

我的一个模型中有以下代码

class PostImage(models.Model):
    post =  models.ForeignKey(Post, related_name="images")
    # @@@@ figure out a way to have image folders per user...
    image = models.ImageField(upload_to='images')
    image_infowindow = models.ImageField(upload_to='images')
    image_thumb = models.ImageField(upload_to='images')
    image_web = models.ImageField(upload_to='images')
    description = models.CharField(max_length=100)
    order = models.IntegerField(null=True)

    IMAGE_SIZES = {
        'image_infowindow':(70,70),
        'image_thumb':(100,100),
        'image_web':(640,480),
    }

    def delete(self, *args, **kwargs):
        # delete files..
        self.image.delete(save=False)
        self.image_thumb.delete(save=False)
        self.image_web.delete(save=False)
        self.image_infowindow.delete(save=False)
        super(PostImage, self).delete(*args, **kwargs)

我试图在 PostImage 上调用 delete() 方法时删除文件。但是,文件不会被删除。

如您所见,我重写了 delete() 方法,并删除了每个 ImageField。但是由于某些原因,这些文件没有被删除。

最佳答案

您可以使用多种方法删除模型实例。

一种方法是调用delete():

PostImage.objects.get(...).delete()

在这种情况下,delete() 被调用,因此文件将被删除。但是,您也可以使用查询集删除对象:

PostImage.objects.filter(...).delete()

不同的是,使用后一种方法,Django会使用SQLDELETE命令批量删除对象,因此每个对象的delete()方法不是叫。因此,您可能正在使用查询集删除对象,因此不会删除文件。

您可以使用 post_delete Django 信号解决这个问题,如下所示:

@receiver(post_delete, sender=PostImage)
def post_delete_user(sender, instance, *args, **kwargs):
    instance.image.delete(save=False)
    instance.image_thumb.delete(save=False)
    instance.image_web.delete(save=False)
    instance.image_infowindow.delete(save=False)

请注意,如果您使用此方法,则不必再覆盖delete() 方法。

关于此的更多信息 herehere

关于python - 删除与模型关联的文件 - django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12888318/

相关文章:

python - 简单抓取 youtube xml 以获得 Python 视频列表

Python Pandas : Parse Into new DateTime Column

django - 使用日期时间字段按天对 Django 模型条目进行分组

python - Tornado +桃子。重新启动损坏的连接

python - Django 静态文件 - CSS 文件无法加载

python - 如何将背景颜色放在 vtktextactor 后面?

python - 将 tf.dataset 中的每个样本映射到 id

python - 来自网络摄像头的mjpeg流中的OpenCv Python框架为空

django - 干燥 Django View request.user 对象

django - 从 python-social-auth 后端获取 DRF token