网站建设资讯

NEWS

网站建设资讯

如何进行admin的save_model改写

本篇文章给大家分享的是有关如何进行admin的save_model 改写,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

创新互联致力于互联网网站建设与网站营销,提供网站制作、网站设计、网站开发、seo优化、网站排名、互联网营销、微信小程序、公众号商城、等建站开发,创新互联网站建设策划专家,为不同类型的客户提供良好的互联网应用定制解决方案,帮助客户在新的全球化互联网环境中保持优势。

一、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法,代码中添加了注释。

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


文章名称:如何进行admin的save_model改写
本文网址:http://cdweb.net/article/gpcsdo.html