删除与djang模型关联的文件

2024-04-20 07:54:05 发布

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

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

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。但是由于某些原因,这些文件没有被删除。在


Tags: 文件toimageselfwebfalsemodelssave
1条回答
网友
1楼 · 发布于 2024-04-20 07:54:05

可以使用多个方法删除模型实例。在

一种方法是调用delete()

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

在本例中,delete()被调用,因此文件将被删除。但是,也可以使用querysets删除对象:

^{pr2}$

不同之处在于,使用后一种方法,Django将使用SQLDELETE命令批量删除对象,因此不调用每个对象的delete()方法。因此,您可能正在使用querysets删除对象,因此不会删除文件。在

您可以使用post_deleteDjango信号来解决此问题,如下所示:

@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的详细信息

相关问题 更多 >