千家信息网

如何进行admin的save_model 改写

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,本篇文章给大家分享的是有关如何进行admin的save_model 改写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、admin 的
千家信息网最后更新 2024年11月24日如何进行admin的save_model 改写

本篇文章给大家分享的是有关如何进行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 QrCode

class 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 customers

class 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 改写,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0