需求为 在后台增加,修改模型的时候后,希望清空缓存.可通过重写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等,代码如上