Как вызвать функцию при удалении объекта модели на странице администрирования django? (или переопределить действие удаления?)

Мне нужно вызывать функцию каждый раз, когда объект модели удаляется через страницу администратора. Как я могу это сделать?

Да, это называется сигналом 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)

Эта функция будет вызвана ПОСЛЕ удаления объекта. Существуют также pre_save, post_save, среди других типов сигналов.

Этот сигнал будет вызываться при удалении из админки или при ЛЮБОМ действии удаления в любом месте (ваша другая логика, представления, оболочка python и т.д.).

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 определите метод ready, который будет подключаться 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()

ваша обычная функция удаления модели не будет работать, способ обойти это - используя пост delete sgnal, создайте файл signals.py в вашей директории приложения

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

@receiver(post_delete, sender=ModelName)
def deleting_model(sender, instance, **kwargs):
    #your action goes here
    pass

Затем определите метод ready в вашем apps.py

#apps.py
from django.apps import AppConfig


class AppNameConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'appname'

    def ready(self):
        import appname.signals
Вернуться на верх