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)
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()方法,从而触发我的自定义文件删除代码.这是更昂贵的数据库是的,但是当你试图删除硬盘上的文件时,再多次点击数据库并不是一笔巨大的开支.