前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django 源码改写笔记

django 源码改写笔记

作者头像
用户4945346
发布2020-06-16 10:33:35
5030
发布2020-06-16 10:33:35
举报
文章被收录于专栏:pythonista的日常

一、admin 的 save_model 改写

我们后台项目有用到 django的 admin 后台模块,有些配置的功能完全可以通过 django 就可以实现,不用前端再开发管理页面了,但是有些操作需要自定义的,比如我们配置某个小程序的二维码规则,admin 保存配置后需要调取微信端的接口更新对应的配置,admin暴露出来的接口只是将数据保存到数据库功能,实现保存后调取微信 api 接口就要改写 admin 的源码 save_mode 方法了,代码如下:

代码语言:javascript
复制
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

代码如下:

代码语言:javascript
复制
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()  # 自定义一个客户的管理类对象
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 pythonista的日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档