我的一个模型中有以下代码
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)
我试图在调用 delete() 方法时删除文件PostImage
。但是,这些文件并未被删除。
如您所见,我重写了 delete() 方法,并删除了每个ImageField
。但由于某种原因,这些文件没有被删除。
您可以使用多种方法删除模型实例。
一种方法是调用delete()
:
PostImage.objects.get(...).delete()
在这种情况下delete()
被调用,因此文件将被删除。但是,您也可以使用查询集删除对象:
PostImage.objects.filter(...).delete()
不同的是,使用后一种方法,Django会使用SQL批量删除对象DELETE
命令,因此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()
方法不再了。
有关此的更多信息here https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects and here https://docs.djangoproject.com/en/dev/ref/signals/#post-delete
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)