所以我有以下模型。
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相同,但文件仍未删除。
我在这里缺少什么?
答案 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在下面的评论中指出了这一点。