models.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)
效果很好(我从管理面板中删除了一张图片,这张图片会自动从磁盘中删除)。
但是当我通过管理面板删除汽车对象时,图像不会从磁盘中删除。
如何解决这个问题?
谢谢!
最佳答案
我确信这里的问题是 ORM 使用 ON DELETE CASCADE
让数据库句柄删除关系,这意味着您的 delete
方法不会被调用.
您可能可以应用此处使用的相同技术并执行以下操作:
class Car(models.Model):
...
def delete(self, *args, **kwargs):
for picture in self.pictures.all():
storage, path = picture.image.storage, picture.image.path
storage.delete(path)
super(Car, self).delete(*args, **kwargs)
但是,您最好使用信号而不是覆盖 delete
方法 https://docs.djangoproject.com/en/dev/ref/signals/#post-delete
Note that the delete() method for an object is not necessarily called when deleting objects in bulk using a QuerySet. To ensure customized delete logic gets executed, you can use pre_delete and/or post_delete signals.
关于python - 从磁盘中删除外键上的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27043856/