在 Django 管理页面中删除模型对象时如何调用函数? (或覆盖删除操作?)

How to call a function when you delete a model object in django admin page? (or override delete action?)

每当我通过管理页面删除模型的对象时,我都需要调用一个函数。我怎么能这样做?

是的,它叫做 post_delete 信号。这是一种方法(您可以将其添加到 models.py 文件的底部,或者至少在您的模型之后:

from django.db.models.signals import post_delete
from django.dispatch import receiver

@receiver(post_delete, sender=YourModelName)
def signal_function_name(sender, instance, using, **kwargs):
    your_function(args)

删除对象后将调用此函数。 other types of signals.

中还有pre_save、post_save

此信号将在从管理员内部删除或在任何地方执行任何删除操作时调用(您的其他逻辑、视图、python shell 等)。

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

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

在你的应用目录下创建一个文件signals.py,例如,我试图在删除文章时删除文章作者的所有相关标签。

from django.db.models.signals import post_delete
from django.dispatch import receiver

from articles.models import Article
from common.methods import tagClear

@receiver(post_delete, sender=Article)
def authorTagClear(sender, instance, using, **kwargs):
    tagClear(instance, instance.author, against=1)

apps.py 中定义一个就绪方法,这将在应用程序运行时插入 signals

from django.apps import AppConfig


class ArticlesConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'articles'

    def ready(self):
        import articles.signals
        return super().ready()