如何覆盖模型上的delete()并使其仍然可以使用相关的删除

oro*_*aki 23 python django overloading django-models

我遇到了问题,因为我正在使用some_widget_instance.delete()删除Widget.我还有一个名为WidgetFile的模型,它有一个覆盖delete()方法,这样我就可以在删除WidgetFile时删除硬盘上的文件.我遇到的问题是,如果我删除一个Widget,它有与之相关的WidgetFiles:

class WidgetFile(models.Model):

    widget = models.ForeignKey(Widget)
Run Code Online (Sandbox Code Playgroud)

好吧,当我删除该Widget时,它的WidgetFiles被删除但是delete()方法不会触发并执行我的额外硬盘驱动器.任何帮助深表感谢.

Ele*_*oid 64

我正在做同样的事情,注意到你应该考虑的Django文档中的一个金块.

覆盖预定义的模型方法

覆盖删除请注意,使用QuerySet批量删除对象时,不一定要调用对象的delete()方法.要确保执行自定义删除逻辑,您可以使用pre_delete和/或post_delete信号.

这意味着您的代码段并不能满足您的需求.使用信号是处理删除的更好选择.

我选择了以下内容:

import shutil
from django.db.models.signals import pre_delete 
from django.dispatch import receiver

@receiver(pre_delete)
def delete_repo(sender, instance, **kwargs):
    if sender == Set:
        shutil.rmtree(instance.repo)
Run Code Online (Sandbox Code Playgroud)

  • 什么是‘集合’?您正在监控删除的模型? (3认同)

oro*_*aki 33

我想到了.我只是把它放在那个Widget模型上:

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

这会触发每个相关对象上必要的delete()方法,从而触发我的自定义文件删除代码.这是更昂贵的数据库是的,但是当你试图删除硬盘上的文件时,再多次点击数据库并不是一笔巨大的开支.

  • 我删除了那一点...... 4.5年前我认为这可能是一个好主意,但我不太清楚为什么. (2认同)