一尘不染

Django模型:delete()未触发

django

我有一个模型:

class MyModel(models.Model):
 ...
    def save(self):
        print "saving"
        ...
    def delete(self):
        print "deleting"
        ...

save()-方法被触发,但delete()没有被触发。


阅读 765

收藏
2020-04-02

共1个答案

一尘不染

我认为你可能正在使用管理员的批量删除功能,并且遇到了管理员的批量删除方法未调用的事实delete()

我过去通过编写用于删除模型的自定义admin操作来解决此问题。

如果你没有使用管理员的批量删除方法(例如,你单击对象的编辑页面上的删除按钮),则说明正在进行其他操作。

请在此处查看警告:

QuerySet.delete()出于效率考虑,使用“删除选定对象”操作有一个重要的警告:delete()不会调用模型的方法。

如果你想覆盖此行为,只需编写一个自定义操作即可以你喜欢的方式完成删除操作,例如,通过调用Model.delete()每个选定项。

有关批量删除的更多背景,请参见有关对象删除的文档。

我的自定义管理员模型如下所示:

from photoblog.models import PhotoBlogEntry
from django.contrib import admin    

class PhotoBlogEntryAdmin(admin.ModelAdmin):
    actions=['really_delete_selected']

    def get_actions(self, request):
        actions = super(PhotoBlogEntryAdmin, self).get_actions(request)
        del actions['delete_selected']
        return actions

    def really_delete_selected(self, request, queryset):
        for obj in queryset:
            obj.delete()

        if queryset.count() == 1:
            message_bit = "1 photoblog entry was"
        else:
            message_bit = "%s photoblog entries were" % queryset.count()
        self.message_user(request, "%s successfully deleted." % message_bit)
    really_delete_selected.short_description = "Delete selected entries"

admin.site.register(PhotoBlogEntry, PhotoBlogEntryAdmin)
2020-04-02