覆盖 django 的模型删除方法进行批量删除 [英] Override django's model delete method for bulk deletion

查看:28
本文介绍了覆盖 django 的模型删除方法进行批量删除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为了删除磁盘中图像字段的孤立文件,我重写了 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆