【发布时间】:2012-05-14 07:48:56
【问题描述】:
我有一个带有FileField 的模型:
class FileModel(models.Model):
name = models.CharField(max_length=100)
description = models.CharField(max_length=200)
file = models.FileField(upload_to='myfiles')
当你删除带有FileField的模型实例时,django不会自动从文件系统中删除底层文件,所以我设置了一个信号来删除post_delete上的底层文件:
def on_delete(sender, instance, **kwargs):
instance.file.delete()
models.signals.post_delete.connect(on_delete, sender=FileModel)
问题是,当我删除 FileModel 对象(比如说从 django 管理页面)时,它会从文件系统中删除文件,但不会删除模型。如果我再次删除它,它会删除模型,但是当它尝试从文件系统中删除文件时会引发异常,因为该文件不存在。
当我将文件删除更改为在pre_delete 而不是post_delete 上发生时,它的行为应如此。我能想到的唯一会导致这种行为的事情是,如果从 FileField 中删除文件会自动保存模型,这将导致它在 post_delete 中重新创建。
所以我的问题是:为什么在post_delete 中调用FileField 的删除方法会阻止模型被删除?
【问题讨论】:
标签: django django-models