覆盖 django 的模型删除方法进行批量删除 [英] Override django's model delete method for bulk deletion
问题描述
为了删除磁盘中图像字段的孤立文件,我重写了 Django 的模型删除方法,如下所示:
I'm overriding Django's model delete method in order to delete orphan files in the disk for image fields, something like this:
class Image(models.Model):
img = models.ImageField(upload_to=get_image_path)
...
def delete(self, *args, **kwargs):
self.img.delete()
super(Image, self).delete(*args, **kwargs)
当我从管理员中删除单个对象时,这工作正常,但是当我选择多个对象并删除它们时,这似乎没有被调用.我已经在谷歌上搜索了一段时间,但没有找到正确的关键字来获得答案,官方文档似乎也没有讨论这个主题.
This works fine when I delete single objects from the admin, but when I select multiple objects and delete them, this doesn't seem to get called. I have been googling for a while but haven't hit the right keywords to get the answer for this, nor the official documentation seems to talk about this subject.
推荐答案
delete() 方法执行批量删除,并且不会在您的模型上调用任何 delete() 方法.但是,它确实为所有已删除的对象(包括级联删除)发出 pre_delete 和 post_delete 信号.
The delete() method does a bulk delete and does not call any delete() methods on your models. It does, however, emit the pre_delete and post_delete signals for all deleted objects (including cascaded deletions).
为此,您可以覆盖 QuerySet
上的删除方法,然后将该 QuerySet
应用为经理:
For that to work, you can override delete method on QuerySet
, and then apply that QuerySet
as manager:
class ImageQuerySet(models.QuerySet):
def delete(self, *args, **kwargs):
for obj in self:
obj.img.delete()
super(ImageQuerySet, self).delete(*args, **kwargs)
class Image(models.Model):
objects = ImageQuerySet.as_manager()
img = models.ImageField(upload_to=get_image_path)
...
def delete(self, *args, **kwargs):
self.img.delete()
super(Image, self).delete(*args, **kwargs)
这篇关于覆盖 django 的模型删除方法进行批量删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!