我正在从表单中删除一个相关的模型(与django管理方式几乎相同),我有一个有很多图像的项目,图像属于item (ForeignKey)。在从表单中删除图像/图像时,我实现了一个post_delete信号来删除缩略图和图像,问题是在post_delete缩略图中删除了缩略图,但是db中的图像条目仍然是:
# Auto-delete files from filesystem when they are unneeded:
@receiver(models.signals.post_delete, sender=ImageModel)
def auto_delete_file_on_delete(sender, instance, **kwargs):
"""Deletes file from filesystem
when corresponding `ImageModel` object is deleted.
"""
if instance.imagefile:
thumbmanager = get_thumbnailer(instance.imagefile)
thumbmanager.delete()如果最后添加以下内容,则图像实例也将被删除(预期行为):
# Auto-delete files from filesystem when they are unneeded:
@receiver(models.signals.post_delete, sender=ImageModel)
def auto_delete_file_on_delete(sender, instance, **kwargs):
"""Deletes file from filesystem
when corresponding `ImageModel` object is deleted.
"""
if instance.imagefile:
thumbmanager = get_thumbnailer(instance.imagefile)
thumbmanager.delete()
instance.delete()我是不是遗漏了什么?不应该在删除实例之后发送post_delete信号吗?为什么实例在数据库中持久化?我假定这与Queryset删除行为有关,但我对此表示怀疑,因为如果删除信号,则删除ImageModel实例(尽管缩略图仍保留在数据库中)。请注意,模型使用了ImageField字段中的django构建,并且提供了不容易的缩略图:
class ImageModel(models.Model):
...
imagefile = models.ImageField(upload_to="properties/%m/%Y")
item = models.ForeignKey('app.ItemModel', related_name='images')
...上面的解决方案(instance.delete())没有问题,只是对行为感到好奇。
发布于 2014-01-17 11:44:29
好吧,让它加入delete(save=False):
# These two auto-delete files from filesystem when they are unneeded:
@receiver(models.signals.post_delete, sender=ImageModel)
def auto_delete_file_on_delete(sender, instance, **kwargs):
"""Deletes file from filesystem
when corresponding `ImageModel` object is deleted.
"""
if instance.imagefile:
thumbmanager = get_thumbnailer(instance.imagefile)
thumbmanager.delete(save=False)发布于 2015-03-11 12:18:09
您也可以使用django-清理,当您删除模型时,它会在FileField上自动调用delete方法。
pip install django-cleanupsettings.py
INSTALLED_APPS = (
...
'django_cleanup', # should go after your apps
)https://stackoverflow.com/questions/21184696
复制相似问题