django - 覆盖 django 的模型删除方法进行批量删除

标签 django model bulk imagefield

我正在覆盖 Django 的模型删除方法,以便删除磁盘中图像字段的孤立文件,如下所示:

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)

当我从管理员中删除单个对象时,这很好用,但是当我选择多个对象并删除它们时,这似乎没有被调用。我已经在谷歌上搜索了一段时间,但没有找到正确的关键字来获得答案,官方文档似乎也没有谈论这个主题。

最佳答案

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



为此,您可以覆盖 QuerySet 上的删除方法,然后应用该 QuerySet作为经理:
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 - 覆盖 django 的模型删除方法进行批量删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28896237/

相关文章:

django - 如何从 Django 管理界面禁用 "Recent Actions"小部件?

python - 如何防止 django 表单删除换行符

c# - Entity Framework : Object is null but the foreign key isn't

php - 获取模型名称以在 CakePHP 的 AppModel 中实现可重用的方法

c++ - 当 VARBINARY(MAX) 列的大小超过 8000 字节时,bcp_bind 失败

java - Java实现定时刷新Cache

c# - 在 C# 中使用自定义分隔符和一些非常非常大的字段值解析文本的最快方法是什么?

Django - 'helpers' 不是有效的标签库

python - SynapsePay 和 Django 用户问题的冲突实例

mysql - CakePHP 2.4.2 为什么 Cake 使用模型名称作为 SQL 查询?