型号.py:
class Car(models.Model):
...
class Pictures(models.Model):
car = models.ForeignKey(Car, related_name='pictures')
width = models.PositiveIntegerField(editable=False, default=780)
height = models.PositiveIntegerField(editable=False, default=585)
image = models.ImageField(upload_to = get_file_path, max_length=64, height_field='height', width_field='width')
def __unicode__(self):
return str(self.id)
def delete(self, *args, **kwargs):
storage, path = self.image.storage, self.image.path
super(Pictures, self).delete(*args, **kwargs)
storage.delete(path)
它工作得很好(我从管理面板中删除一张图片,这张图片会自动从磁盘中删除)。你知道吗
但当我通过管理面板删除汽车对象时,图像并没有从磁盘中删除。你知道吗
怎么解决?你知道吗
谢谢!你知道吗
我开始研究这个,发现了一些关于管理和删除对象的有趣的事情。你知道吗
当从admin中删除对象时,将调用以下函数:
django/承包商/管理员/选项.py->;删除模型()
它依次调用
obj.delete()
,obj是被删除的当前对象。你知道吗然后,对象的delete方法运行以下代码
收集器对象现在有一个包含所有相关对象的属性'data'。 当
collector.delete()
运行时,它执行函数query.delete_batch(pk_list, self.using)
,该函数使用参数pk\u list进行批量删除,pk\u list是要删除的相关对象的主键列表。批量删除函数不调用被删除的每个相关对象的delete方法。你知道吗这里的好处是所有相关对象都会调用pre\u save和post\u save信号,因此我们可以将您的自定义删除代码移动到Pictures模型的pre\u save或post\u save信号中。你知道吗
我在想这应该行得通,但我还没有机会测试。你知道吗
我确信这里的问题是ORM使用
ON DELETE CASCADE
让数据库句柄删除关系,这意味着delete
方法不会被调用。你知道吗你可以用你在这里使用的方法来做:
但是,最好使用信号,而不是重写
delete
方法https://docs.djangoproject.com/en/dev/ref/signals/#post-delete相关问题 更多 >
编程相关推荐