Django Can';t删除文件字段';s文件在post_中删除

Django Can';t删除文件字段';s文件在post_中删除,django,django-models,Django,Django Models,我有一个带有文件字段的模型: class FileModel(models.Model): name = models.CharField(max_length=100) description = models.CharField(max_length=200) file = models.FileField(upload_to='myfiles') 当您删除带有文件字段的模型实例时,django不会自动从文件系统中删除基础文件,因此我在post_delete上设置了

我有一个带有
文件字段的模型

class FileModel(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=200)
    file = models.FileField(upload_to='myfiles')
当您删除带有
文件字段的模型实例时,django不会自动从文件系统中删除基础文件,因此我在
post_delete
上设置了删除基础文件的信号:

def on_delete(sender, instance, **kwargs):
    instance.file.delete()

models.signals.post_delete.connect(on_delete, sender=FileModel)
问题是,当我删除一个
FileModel
对象(比如从django管理页面)时,它会从文件系统中删除该文件,但不会删除该模型。如果我再次删除它,它会删除该模型,但在尝试从文件系统中删除该文件时会引发异常,因为该文件不存在

当我将文件删除更改为发生在
pre\u delete
而不是
post\u delete
时,它的行为应该是正常的。我唯一能想到的是,如果从
文件字段
中删除文件会自动保存模型,这将导致在
post_delete
中重新创建该模型


所以我的问题是:为什么在
post\u delete
中调用
FileField
的delete方法会阻止模型被删除?

当访问
FileField
属性时,会得到一个
FieldFile
包装器实例。现在猜猜它的
方法的代码是什么。。。
(摘自django.db.models.fields.files)

所以你是对的:)

如果我读对了,您现在可以将它再次连接到
post_delete
信号,并在delete方法上传递
save=False
,它应该可以工作


是的,我只是因为你的问题才查阅了它。

试试看,它会在删除模型实例时删除旧文件,当你将新文件上传到FileField或ImageField时会删除旧文件。

我感谢你花时间对此进行彻底调查。这很好,但现在很多文件实际上都上传到了CDN,不是本地存储的。
def delete(self, save=True):
        # Only close the file if it's already open, which we know by the
        # presence of self._file
        if hasattr(self, '_file'):
            self.close()
            del self.file

        self.storage.delete(self.name)

        self.name = None
        setattr(self.instance, self.field.name, self.name)

        # Delete the filesize cache
        if hasattr(self, '_size'):
            del self._size
        self._committed = False

        if save:
            self.instance.save()