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

时间:2016-01-30 16:29:01

标签: 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关联的文件仍然存在。我尝试使用queryset相同,但文件仍未删除。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

以下是使用信号的替代方法:覆盖模型的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在下面的评论中指出了这一点。