django delete_model 无效,没被调用

 

需求为 在后台增加,修改模型的时候后,希望清空缓存.可通过重写save_model 实现,代码如下

代码跑起来,在后台添加,修改模型,save_model 方法成功调用, 缓存被清空.

@admin.register(Blog)
class BlogAdmin(admin.ModelAdmin):
    list_filter = ('blog_type', 'update_time')
    list_display = ('id', 'title', 'blog_type', 'update_time', 'read_count') #显示字段
    list_display_links = ('id', 'title', 'blog_type', 'update_time', 'read_count') #点击可进入编辑界面
    # list_editable = ['update_time'] #可以编辑的字段

    def blog_type(self, obj):
        return obj.blog_type.type_name

    def save_model(self, request, obj, form, change):
        super().save_model(request, obj, form, change)

        print("save blog")
        if cache.get("hot_blogs"):
            cache.delete('hot_blogs')
            print("删除 hot_blogs cache")
        if cache.get("latest_blogs"):
            cache.delete('latest_blogs')
            print("删除 latest_blogs cache")
        if cache.get('date_count_dict'):
            cache.delete('date_count_dict')
            print("删除 date_count_dict cache")
        if cache.get('all_blogs'):
            cache.delete('all_blogs')
            print("删除 all_blogs cache")



    def delete_model(self, request, obj):
        print("delete blog")
        if cache.get("hot_blogs"):
            cache.delete('hot_blogs')
            print("删除 hot_blogs cache")
        if cache.get("latest_blogs"):
            cache.delete('latest_blogs')
            print("删除 latest_blogs cache")
        if cache.get('date_count_dict'):
            cache.delete('date_count_dict')
            print("删除 date_count_dict cache")
        if cache.get('all_blogs'):
            cache.delete('all_blogs')
            print("删除 all_blogs cache")

        super().delete_model(request, obj)

 

 

需求为 在后台删除模型的时候后,希望清空缓存.通过重写delete_model 实现,代码同上, 但是发现无效,这是一个大大的坑,

原因是删除的界面为

 

勾选记录点击执行,delete_model 是不会被调用的

 

 

只有在记录编辑界面,点击删除按钮,才真正的会执行delete_model中定义的行为

这是一个大大的坑

save_model 可以自定义增加,修改模型时的操作

delete_model 同样可以自定义删除模型时的行为,但是只能够在记录编辑界面才可以,

故想要真正的时候delete_model 还是要借助 signal  post_delete

故解决方案为 在models.py 模型文件中,引入信号机制,执行相关操作

class Blog(models.Model):

    title = models.CharField(max_length = 100, verbose_name = '文章标题')
    content = RichTextField(verbose_name = '内容')
    blog_type = models.ForeignKey(BlogType, on_delete = models.CASCADE, verbose_name = '文章类型')
    update_time = models.DateTimeField( verbose_name = '更新时间')
    read_count  = models.IntegerField(default = 0, verbose_name = '文章阅读数')

    class Meta:
        ordering = ('-update_time',)
        verbose_name = "博文"
        verbose_name_plural = "博文"

    def __str__(self):
        return self.title

@receiver(post_delete, sender=Blog)  #在博客模型删除之后,调用下面方法
def delete_blog_cache(sender, instance, **kwargs):
    print("delete blog")
    if cache.get("hot_blogs"):
        cache.delete('hot_blogs')
        print("删除 hot_blogs cache")
    if cache.get("latest_blogs"):
        cache.delete('latest_blogs')
        print("删除 latest_blogs cache")
    if cache.get('date_count_dict'):
        cache.delete('date_count_dict')
        print("删除 date_count_dict cache")
    if cache.get('all_blogs'):
        cache.delete('all_blogs')
        print("删除 all_blogs cache")

 

 

综上, 如果想要实现类似触发器的效果,也就是在增删改查表的前后,执行自定义的代码,

可以在admin.py 中 重写父类的 save_model 方法, 后台增、删、改 模型, 该方法都会被调用( 亲测 )

在 medels.py中, 引入信号机制,自定义行为,  pre_delete , post_delete , pre_save, post_save等,代码如上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值