首页 > 其他分享 >序列化的另一个思路

序列化的另一个思路

时间:2024-05-11 09:19:07浏览次数:22  
标签:return 一个 self attname models dict rel 思路 序列化


# 混入类,提供Model实例to_dict方法
class ModelMixin(object):
    __slots__ = ()

    def to_dict(self, excludes: tuple = None, selects: tuple = None) -> dict:
        if not hasattr(self, '_meta'):
            raise TypeError(
                '<%r> does not a django.db.models.Model object.' % self)
        elif selects:
            return {f: getattr(self, f) for f in selects}
        elif excludes:
            return {f.attname: getattr(self, f.attname) for f in self._meta.fields if f.attname not in excludes}
        else:
            return {f.attname: getattr(self, f.attname) for f in self._meta.fields}

    def update_by_dict(self, data):
        for key, value in data.items():
            setattr(self, key, value)
        self.save()

class App(models.Model, ModelMixin):
    name = models.CharField(max_length=50)
    key = models.CharField(max_length=50, unique=True)
    desc = models.CharField(max_length=255, null=True)
    rel_apps = models.TextField(null=True)
    rel_services = models.TextField(null=True)
    sort_id = models.IntegerField(default=0, db_index=True)
    created_at = models.CharField(max_length=20, default=human_datetime)
    created_by = models.ForeignKey(User, on_delete=models.PROTECT)

    def to_dict(self, *args, **kwargs):
        tmp = super().to_dict(*args, **kwargs)
        tmp['rel_apps'] = json.loads(self.rel_apps) if self.rel_apps else []
        tmp['rel_services'] = json.loads(
            self.rel_services) if self.rel_services else []
        return tmp

    def __repr__(self):
        return f'<App {self.name!r}>'

    class Meta:
        db_table = 'apps'
        ordering = ('-sort_id',)

项目地址:https://gitee.com/openspug/spug/

标签:return,一个,self,attname,models,dict,rel,思路,序列化
From: https://www.cnblogs.com/dreammooncy/p/18185727

相关文章

  • AutoCAD中一个隐藏的系统变量——GFXDX12,解决硬件加速相关问题
    其实AutoDesk是知道这个问题的,也给出了一个系统变量,也就是:GFXDX12。不过这个系统变量在系统变量列表中是没有列出来的,但在帮助中可以搜索到。GFXDX12的默认值为1,查看帮助文件,大概的意思是,GFXDX12为1时,AutoCAD直接使用系统的硬件特性,主要是DirectX。如果出现卡顿或鼠标拖尾等现象,就......
  • AI已来,我与AI一起用Python编写了一个消消乐小游戏
    在数字化与智能化的浪潮中,目前AI(人工智能)几乎在各行各业中发挥了不可忽略的价值,今天让我们也来体验一下AI的威力:我通过命令,一步一步的教AI利用Python编程语言打造了一款富有创意和趣味性的消消乐小游戏……本文Python消消乐游戏源代码:https://gitee.com/obullxl/Pytho......
  • 分享一个使用python调用websocket获取实时行情数据的方法
    这个站点可以获取:外汇、国际期货、国内期货、贵金属、能源、虚拟货币、股指期货、美股、台股、港股、印度股、A股、ETF等以下是Python的连接demo,可以参考下。同时也支持其他后端语言的连接,PHP、Java等。获取品种地址:http://39.107.99.235:1008/market/market.phpimportj......
  • 用一个查询从销售订单直通供应商账单-NetSuite
    朗读全文Yourbrowserdoesnotsupporttheaudioelement.有什么用用一个查询从销售订单直通供应商账单NetSuite:从SO销售订单,到PO采购订单,到Bill供应商账单下面文章的分享仅作为演示在SuiteQLQueryToo中的展示,现实情况下的应用可以非常灵活(由于范围广泛无法此文章中......
  • Dapr IoT Architecture是一个基于.NET平台的物联网系统架构
    DaprinIoT.UnderstandingofconceptbuildingdistributedapplicationinIoThttps://docs.dapr.io 在构建一个网联网系统(InternetofThings,IoT)或数字化系统的C#开源系统架构中,通常需要考虑以下关键方面:1.设备连接和数据采集:使用C#编写设备连接模块,支持多种通信协......
  • 在Biwen.QuickApi中整合一个极简的发布订阅(事件总线)
    闲来无聊在我的Biwen.QuickApi中实现一下极简的事件总线,其实代码还是蛮简单的,对于初学者可能有些帮助就贴出来,有什么不足的地方也欢迎板砖交流~首先定义一个事件约定的空接口publicinterfaceIEvent{}然后定义事件订阅者接口publicinterfaceIEventSubscriber<T>w......
  • 一个简单的MD5加盐
    虽然都说MD5加密一下密码比较好,但是如果密码过于简单,比如123456,经过MD5加密之后还是不安全,因为别有用心的人可以使用彩虹表来撞库得到密码。因此为了加大破解难度,需要给MD5算法加盐。下面是一个简单的加盐算法。当然,我不是说加了盐就一劳永逸了,下面的代码也不安全,这样做只是为了......
  • 寻找第一个1
    输入一个向量,如何从LSB或者MSB或者反过来找出第一个出现1的位置并生成独热码?这个问题碰到好多次了,今天总结一下。这个电路有点类似于一个优先编码器(所以该电路就是固定优先级的仲裁器),例如对于一个4bit位宽的向量来说,其真值表如下InputOutput00010001xx100010x1......
  • 第一个mybatis程序
    注意与之前JDBC的区别,简化在哪里准备工作数据库,表的创建:创建一个名为mybatis的数据库,在其中创建user表,字段为is,name,pwd项目的准备:新建一个普通的maven项目作为父项目,删除src目录,在pom文件中导入必要的依赖(mysql-connector-java,mybatis,junit),创建第一个子项目,选择父项目......
  • 信息技术服务外包(ITO服务)是一个综合性的服务领域
    信息技术服务外包(ITO服务)是一个综合性的服务领域,涵盖了多个关键的服务类别,以支持企业的信息技术需求。以下是关于ITO服务中包含的BPO、IDC驻场运维、IDC工程实施等三大类别的服务的详细解释:BPO(业务流程外包)服务:主要为客户提供7*24小时的呼入、呼出及在线业务服务。这种全天候......