ModelViewSet额外路由参数 与 ADMIN事件触发

news/2024/10/31 3:29:55/

ModelViewSet额外路由参数

用了DefaultRouter,那么在URL匹配时带路径参数,只有update、delete、retrieve能带,关键是匹配pk还是写死的,我们需要对任意参数,同时还能修改方法命名。

咋搞?很简单。比如我们要在HahaViewSet里写一个xixi的GET haha/{name}/xixi/的接口。

第一步路由:

router = routers.DefaultRouter()
router.register(r'haha', haha.HahaViewSet, basename="haha")urlpatterns = [path('', include(router.urls)),url(r'haha/(?P<name>\w+)/xixi/$', haha.HahaViewSet.as_view({'get': 'xixi'})),...
]

第二步方法:

@swagger_auto_schema(...)
@action(detail=False, methods=["GET"], url_path="")
def xixi(self, request, *args, **kwargs):  # 方法名字要与路由匹配的action字典匹配上name = kwargs.get("name")  # 没有带name,url的w+就不会匹配到,直接404...

ADMIN事件触发

通常在使用Django框架后,定义models时,我们往往会把使用字段放在/admin可访问里,这样比直接去操作DB客户端简单些,而且在实际开发中并不是人人都有去权限去修改DB,就算有修改起来也比较麻烦。

举个使用例子吧,先定义一个model在models.py

class Haha(models.Model):name = models.CharField(verbose_name="姓名", max_length=50, db_index=True)class Meta:verbose_name = "哈哈表"verbose_name_plural = "哈哈表"

那么在admin.py文件就可以加上admin定义:

@admin.register(models.Haha)
class HahaAdmin(admin.ModelAdmin):list_display = ["name"]search_fields = ["name"]

这是个很基本的例子,但如果现在我们的项目用上了缓存呢。

那么在 /admin 增删改根本就不会影响到缓存,而往往我们逻辑上的诉求是在 /admin后台增删改时可以把对应的缓存删掉,待接口调数据调不到时去DB拿,再更新到缓存,admin删除缓存怎么办呢?

这就需要两个东西admin触发事件与model信号,解决admin增删改缓存不一致的问题。

需要重新两个方法(

        save_model, delete_model

)和利用信号机制编写一个信号接收函数(自定义命名)。

from django.contrib import admin
from django_redis import get_redis_connection
from . import models@admin.register(models.Haha)
class HahaAdmin(admin.ModelAdmin):list_display = ["name"]search_fields = ["name"]def save_model(self, request, obj, form, change):# 删除缓存get_redis_connection().delete("%s_key" % obj.name)  # super().save_model(request, obj, form, change)源码也是这个obj.save()  def delete_model(self, request, obj):# 删除缓存get_redis_connection().delete("%s_key" % obj.name)  # super().delete_model(request, obj)源码也是这个obj.delete()

上面是完整的代码,写到这里有小伙伴就拿去测试了,发现为啥删除的时候,缓存去不掉。

这里就有一个特别大的操作误区了。如何才会触发这两个函数。

自行去测试会发现,只对这里的删除和保存才会触发save_model, delete_model。

保存还好,只有这一种保存方式,那么删除呢?

删除还有直接在页面选中删除的方式,这就触发不到delete_model。

这时候就需要信号接受函数,sender就为对应的model

from django.db.models.signals import post_delete
from django_redis import get_redis_connection
from django.dispatch import receiver@receiver(post_delete, sender=Haha)
def delete_cache(sender, instance, **kwargs):# 删除缓存get_redis_connection().delete("%s_key" % name)  

OK,到这里大功告成。

 


http://www.ppmy.cn/news/62962.html

相关文章

音频焦点使用及原理

音频焦点使用及原理 本博客代码基于Android 10源码 为什么会有音频焦点这一概念&#xff1f; 在Android音频领域中&#xff0c;应用层所有的App播放音频&#xff0c;最终都是走到音频回播线程PlaybackThread中&#xff0c;如果多个App都走到同一个PlaybackThread中去&#xff0…

为文本检测和识别在OCR应用中的突破

OCR场景文本识别&#xff1a;文字检测文字识别 随着数字化时代的到来&#xff0c;文字识别技术得到了广泛的应用。OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是一种技术&#xff0c;通过图像处理和计算机视觉来识别印刷或手写文字。在…

[JAVA EE ]创建Servlet——继承HttpServlet类笔记3

Response 一、响应行 组成&#xff1a;协议/版本 响应状态码 状态码描述响应状态码&#xff1a;服务器告诉客户端浏览器本次请求响应的一个状态&#xff0c;都是三位数 1xx&#xff1a;服务器接收客户端消息&#xff0c;但是没有接收完成&#xff0c;等待一段时间后&#xff…

《Vue.js 设计与实现》—— 02 框架设计核心要素

框架设计并非仅仅实现功能那么简单&#xff0c;里面有很多学问。例如&#xff1a; 框架应该给用户提供哪些构建产物&#xff1f;产物的模块格式如何&#xff1f; 当用户没有以预期的方式使用框架时&#xff0c;是否应该打印合适的警告信息从而提供更好的开发体验&#xff0c;让…

惠普暗影精灵5 super 873-068rcn如何重装系统

惠普暗影精灵5 super 873-068rcn是一款家用游戏台式电脑&#xff0c;有时候你可能用久会遇到系统出现故障、中毒、卡顿等问题&#xff0c;或者你想要更换一个新的操作系统&#xff0c;这时候你就需要重装系统。重装系统可以让你的电脑恢复到出厂状态&#xff0c;清除所有的个人…

AI仿写软件-仿写文章生成器

AI仿写软件&#xff1a;高效出色的营销利器 作为互联网时代的营销人员&#xff0c;我们不仅需要品牌意识&#xff0c;还必须深谙营销技巧。万恶的时限压力使得我们不得不在有限的时间内输出更多的文本内容&#xff0c;以便吸引更多的关注。那么&#xff0c;如何解决这个问题呢…

Sass使用

前言&#xff1a; 这份记录&#xff0c;主要是记录学习sass的学习记录&#xff0c;用于记录一些本人认为可能以后会用到的比较常用的一些知识点&#xff0c;更详细的请看sass官网 功能1-嵌套规则 Sass 允许将一套 CSS 样式嵌套进另一套样式中&#xff0c;内层的样式将它外层的…

Python的HTTP库及示例

13.3 HTTP库 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;是一个客户端和服务器端请求和应答的标准。客户端是终端用户&#xff0c;服务器端是网站。客户端发起一个到服务器上指定端口的HTTP请求&#xff0c;服务器向客户端发回一个状态行和响应的消息。 可以…