Override django's model delete method for bulk deletion

前端 未结 3 663
无人共我
无人共我 2020-12-08 07:51

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):
          


        
3条回答
  •  無奈伤痛
    2020-12-08 08:15

    It does:

    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).

    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)
    

提交回复
热议问题