本篇文章给大家分享的是有关如何进行admin的save_model 改写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
一、admin 的 save_model 改写
我们后台项目有用到 django的 admin 后台模块,有些配置的功能完全可以通过 django 就可以实现,不用前端再开发管理页面了,但是有些操作需要自定义的,比如我们配置某个小程序的二维码规则,admin 保存配置后需要调取微信端的接口更新对应的配置,admin暴露出来的接口只是将数据保存到数据库功能,实现保存后调取微信 api 接口就要改写 admin 的源码 save_mode 方法了,代码如下:
from django.contrib import admin# Register your models here.from index.models import QrCodeclass QrCodeAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): content = form.cleaned_data.get("content") # 获取页面表单填写的信息,是个字典类型 try: now = json.loads(content) except Exception as e: raise TypeError("二维码规则配置必须是可以json格式化的") if change: # (如果资料时新增时,change是False,修改资料时是True) old = self.get_object(request, obj.id) # 这个方法可以获取没保存之前的对象 old = old.content old = json.loads(old) if old != now: # 如果修改二维码参数 # 获取appid pt_appid_ = AppletServer.objects.filter(qr_code=obj.id).values_list("app_id", flat=True) # 第三方平台appid set_pt_appid = set(pt_appid_) apps_id = MiniApp.objects.filter(AppId__in=set_pt_appid).values_list("app_id", flat=True) for appid in apps_id: add_qr_code(app_id=appid, json_kwargs=now) obj.save() # 保存结果 admin.site.register(QrCode, QrCodeAdmin) # 将模型注册到 admin
下图中点击保存时,admin 会调用上面的 save_model法,代码中添加了注释。
二、自定义 model 模型的查询集。
例如,我们原先有个模型 Customer ,之前所有关于 Customer 的查询用的都是 Customer.objects.all() 。但是最近我们有个需求,要给 Customer 加个字段是否为微信默认用户,这样的话,原先关于 Cusomer 查询都要加个过滤条件,这样以前写的关于 Customer 查询的语句代码都要改,要修改很多地方。但是这个可以改写管理类对象方法实现上述需求,就无需改动那么多的代码。效果比如:
Customer.objects.all() 查询不是微信默认用户的 customer
Customer.all_objects.all() 查询所有的customer
代码如下:
class AllCustomerManager(models.Manager): # 改变查询的结果集 def all(self): # 1.调用父类的all, 获取所有数据 customers = super().all() # 2. 返回的books是QuerySet集合,还可以继续使用所有查询 return customersclass CustomerManager(models.Manager): # 改变查询的结果集 def get_queryset(self): return super(CustomerManager, self).get_queryset().filter(is_default_wx=False)class Customer(models.Model, CustomerMixin): user = models.OneToOneField(BaseUser, on_delete=models.PROTECT, related_name="customer", null=True) is_default_wx = models.BooleanField(verbose_name="微信默认用户", default=True) class Meta: ordering = ["-id", ] db_table = "customer" verbose_name = "客户" # def __str__(self): # return self.company_name all_objects = AllCustomerManager() # 自定义一个客户的管理类对象 objects = CustomerManager() # 自定义一个客户的管理类对象
以上就是如何进行admin的save_model 改写,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4579283/blog/4351026