python - django:在对象上调用 delete 不会删除文件

标签 python django

所以我有以下模型。

class StoreSegments01(models.Model):
    segment = models.FileField(upload_to=content_file_name)
    segmentID = models.TextField(max_length=100, default=11)

class StoreSegments01Form(forms.ModelForm):
    class Meta:
    model = StoreSegments01
    fields = ['segment', 'segmentID']

def content_file_name(instance, filename):
    return '{0}'.format(instance.segmentID)

我想为用户提供一种删除文件的方法。在 manage.py shell 中,我尝试以下操作:

obj = StoreSegments01.objects.get(segmentID='239fd363-562a-41b3-a915-b7a84cc4a172')
>>> obj.delete()

删除与指定segmentID相关的记录,但与该ID相关联的文件还在。我对查询集进行了同样的尝试,但文件仍未删除。

我在这里错过了什么?

最佳答案

这里有一个使用信号的替代方法:覆盖模型的 delete 方法。

例子:

class StoreSegments01(models.Model):
    segment = models.FileField(upload_to=content_file_name)
    segmentID = models.TextField(max_length=100, default=11)

    def delete(self, *args, **kwargs):
        # first, delete the file
        self.segment.delete(save=False)

        # now, delete the object
        super(StoreSegments01, self).delete(*args, **kwargs)

对于 Python 3,像这样调用 super:super().delete(*args, **kwargs)

注意! : 如果您删除单个对象,这会起作用。但是,如果您批量删除对象,则不会删除关联的文件。因为删除单个对象调用model.delete()方法,而批量删除调用queryset.delete()方法。感谢Håken Lid谁在下面的评论中指出了这一点。

关于python - django:在对象上调用 delete 不会删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35104143/

相关文章:

python - Pycharm 转换空格并且不会转换回来

使用边界的 Python/Django mime 多部分电子邮件

python - Pandas 根据 bool 值创建新列

django - django widget_tweaks 可以将输入渲染为文本区域框吗?

python - 我们可以在不同的项目中使用 django 身份验证作为微服务吗?

python - 带有连字符的 django url 的问题

python - 使用 Chromedriver 设置 Chrome 的下载首选项 (Python)

使用 HMAC-SHA256 的 Python 编码消息

python - Django ORM 可以有 strip 字段吗?

python - 提交空表格和奇怪的输出