dge*_*gel 4 django django-models
我有一个模型FileField:
class FileModel(models.Model):
name = models.CharField(max_length=100)
description = models.CharField(max_length=200)
file = models.FileField(upload_to='myfiles')
Run Code Online (Sandbox Code Playgroud)
当您使用a删除模型实例时FileField,django不会自动从文件系统中删除基础文件,因此我设置了一个信号来删除基础文件post_delete:
def on_delete(sender, instance, **kwargs):
instance.file.delete()
models.signals.post_delete.connect(on_delete, sender=FileModel)
Run Code Online (Sandbox Code Playgroud)
问题是,当我删除一个FileModel对象(比如说来自django管理页面)时,它会从文件系统中删除该文件,但不会删除该模型.如果我再次删除它,它会删除模型,但在尝试从文件系统中删除文件时会引发异常,因为该文件不存在.
当我更改文件删除时,pre_delete而不是post_delete它应该行为.我能想到的唯一可能导致此行为的是,如果从FileField自动保存模型中删除文件,则会导致重新创建该模型post_delete.
所以我的问题是:为什么调用一个FileField删除方法来post_delete阻止模型被删除?
当您访问FileField属性时,您将获得一个FieldFile包装器实例.现在猜猜它的.delete方法代码是什么......(从django.db.models.fields.files中删除)
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()
Run Code Online (Sandbox Code Playgroud)
所以你是对的:)
如果我正确读取它,你现在可以再次将它连接到post_delete信号并传递save=False删除方法,它应该工作.
是的,我只是因为你的问题而查了一下.
| 归档时间: |
|
| 查看次数: |
1379 次 |
| 最近记录: |