如何覆盖模型上的 delete() 并使其仍然适用于相关删除 [英] How do I override delete() on a model and have it still work with related deletes

查看:14
本文介绍了如何覆盖模型上的 delete() 并使其仍然适用于相关删除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了问题,因为我正在使用 some_widget_instance.delete() 删除小部件.我还有一个名为 WidgetFile 的模型,它带有一个覆盖 delete() 方法,这样我就可以在删除 WidgetFile 时从硬盘驱动器中删除文件.我遇到的问题是,如果我删除了一个 Widget,并且它有与它相关的 WidgetFiles,如下所示:

I'm having a problem because I'm deleting a Widget by using some_widget_instance.delete(). I also have a model called WidgetFile with an override delete() method so that I can delete files off my hard drive when a WidgetFile is deleted. The problem I'm having is that if I delete a Widget, and it has WidgetFiles related to it like this:

class WidgetFile(models.Model):

    widget = models.ForeignKey(Widget)

好吧,当我删除那个 Widget 时,它的 WidgetFiles 被删除了,但 delete() 方法不会触发并执行我额外的硬盘驱动器操作.非常感谢任何帮助.

Well, when I delete that Widget, it's WidgetFiles are deleted but the delete() method doesn't trigger and do my extra hard drive stuff. Any help is much appreciated.

推荐答案

我想通了.我只是把它放在那个小部件模型上:

I figured it out. I just put this on that Widget model:

def delete(self):
    files = WidgetFile.objects.filter(widget=self)
    if files:
        for file in files:
            file.delete()
    super(Widget, self).delete()

这在每个相关对象上触发了必要的 delete() 方法,从而触发了我的自定义文件删除代码.是的,它的数据库成本更高,但是当您无论如何都要尝试删除硬盘驱动器上的文件时,多访问几次数据库并不是什么大开销.

This triggered the necessary delete() method on each of the related objects, thus triggering my custom file deleting code. It's more database expensive yes, but when you're trying to delete files on a hard drive anyway, it's not such a big expense to hit the db a few extra times.

这篇关于如何覆盖模型上的 delete() 并使其仍然适用于相关删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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