所以我有以下模型。
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/