Flask SQLAlchemy_Serializer ORM模型序列化

news2024/11/25 0:47:40

在前后端分离项目中,经常需要把ORM模型转化为字典,再将字典转化为JSON格式的字符串。在遇到sqlalchemy_serializer之前,我都是通过类似Java中的反射原理,获取当前ORM模型的所有字段,然后写一个to_dict方法来将字段以及他的值封装成字典。大概的代码如下所示:

def to_dict(self):
  return {c.name: str(getattr(self, c.name)) for c in self.__table__.columns}

这种做法虽然一定程度上方便了开发,但也是带着枷锁跳舞,存在以下几个弊端:

  1. 无法优雅的排除不需要序列化的字段。

  2. 无法优雅的序列化多表之间的关系。

直到后来我遇到了sqlalchemy_serializer,泪流满面,这不就是我苦苦寻找的ORM模型序列化库吗?使用他序列化ORM模型,让我带你看看有多爽!

一、安装:

sqlalchemy-serializer已经上架PyPi,因此通过pip命令即可安装:

 pip install SQLAlchemy-serializer

二、基本使用:

如果想要让某个ORM模型能被序列化,那么只需要在定义模型的时候,让他继承自sqlalchemy_serializer.SerializerMixin即可,示例代码如下:

from sqlalchemy_serializer import SerializerMixin

class UserModel(db.Model, SerizlizerMixin):
    __tablename__ = "user"
    id = db.Column(db.String(100), primary_key=True, default=shortuuid.uuid)
    email = db.Column(db.String(50), unique=True, nullable=False)
    username = db.Column(db.String(50), nullable=False)
    password = db.Column(db.String(200), nullable=False)

SerizlizerMixin会给ORM模型添加一个to_dict方法,此时你可以通过一行代码将ORM模型序列化成字典:

user = UserModel.query.filter(...).one()
user_dict = user.to_dict()

上述代码中将把UsrModel中所有字段都序列化成字典。

三、排除字段:

模型中有的字段不需要被序列化,比如用户的密码,那么这时候可以通过设置rules参数,或者only参数来指定序列化规则。比如排除password,那么可以通过如下代码方式实现:

user = UserModel.query.filter(...).one()
user_dict = user.to_dict(rules=('-password',))

上述代码中在调用to_dict方法的时候,传递了rules参数,并且设置了-password,其中的-号代表排除的意思,意思是不要序列化password。如果在绝大部分场景下都不需要某些字段,可以把这个规则写在模型定义中,这样所有序列化的时候,都会遵循这个序列化规则。比如:

class UserModel(db.Model, SerizlizerMixin):
    serialize_rules = ("-password", )
    __tablename__ = "user"
    id = db.Column(db.String(100), primary_key=True, default=shortuuid.uuid)
    email = db.Column(db.String(50), unique=True, nullable=False)
    username = db.Column(db.String(50), nullable=False)
    password = db.Column(db.String(200), nullable=False)

如果需要排除的字段太多了,我们可以通过设置serialize_only属性来标记仅仅序列化某些字段。比如:

class UserModel(db.Model, SerizlizerMixin):
    serialize_only = ("id", "username")
    __tablename__ = "user"
    id = db.Column(db.String(100), primary_key=True, default=shortuuid.uuid)
    email = db.Column(db.String(50), unique=True, nullable=False)
    username = db.Column(db.String(50), nullable=False)
    password = db.Column(db.String(200), nullable=False)

上述代码在序列化的时候,就只会序列化id和username两个字段了。

四、递归序列化模型和树:

sqlalchemy_serializer会默认序列化定义好关系的模型,比如有UserModel和PostModel两个模型:

class UserModel(db.Model, SerizlizerMixin):
    serialize_rules = ("-posts",)
    __tablename__ = "user"
    id = db.Column(db.String(100), primary_key=True, default=shortuuid.uuid)
    username = db.Column(db.String(50), nullable=False)
    
class PostModel(db.Model, SerializerMixin):
    __tablename__ = "post"
    id = db.Column(db.String(100), primary_key=True, default=shortuuid.uuid)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)
    author_id = db.Column(db.String(100), db.ForeignKey("user.id"))
    
    author = db.relationship("UserModel", backref="posts")

在序列化PostModel的时候,也会自动递归序列化author,并且author的值有id和username两个字段。这里有个细节需要注意,就是UserModel必须要排除posts。因为PostModel中的author字段,通过backref给UserModel绑定了一个posts字段,如果不排除posts,那么在序列化author的时候,又会序列化posts,造成循环递归序列化。

五、高级用法:

基本上学会以上用法后,99%的场景都没有问题了。如果你在使用sqlalchemy_serializer还有其他业务需求,比如格式化日期的输出、字段扁平化等,那么可以再仔细阅读一下sqlalchemy_serializer的官方文档:官方文档

项目中引用

在这里插入图片描述
将登录后数据序列化返回
在这里插入图片描述
序列化后的数据,此时看到的跟该用户相关的评论,帖子也序列化了,这就会循环序列化
在这里插入图片描述
可以设置仅序列化的字段
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang假共享(false sharing)详解

多核处理器(SMP)系统中, 每一个处理器都有一个本地高速缓存。内存系统必须保证高速缓存的一致性。当不同处理器上的线程修改驻留再同一高速缓存中的变量时就会发生假共享(false sharing),结果导致高速缓存无效,并强制更新,进而影响系统性能。 什么是假共享(false sharin…

论文解读|VoxelNet:基于点云的3D物体检测的端到端学习

原创 | 文 BFT机器人 01 摘要 论文提出了表述了一个新的基于点云的3D检测方法,名为VoxelNet,该方法是一个端到端可训练的深度学习架构,利用了稀疏点云的结构特性,直接在稀疏的3D点上进行操作,并通过高效的并行处理体素…

Stable Diffusion - ChatGPT4 与 Stable Diffusion 结合提供无限创意构图

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131782672 ChatGPT 和 StableDiffusion 结合使用的优势: 高效率:ChatGPT 可以在很短的时间内完成复杂的语言任务&#xf…

Kotlin基础(六) 枚举类和扩展

前言 本文主要讲解kotlin枚举类和扩展 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 枚举类 1.1.1 枚举类的基本用法 Kotlin中的枚举类(enum class)用于定义一组具有预定义值的常量。它们在许多情况下都很有用,例如表示一组…

介绍性能压力测试的重要性

在当今数字化时代,软件和应用程序的性能对于用户体验和业务成功至关重要。为了确保系统在面临高负载和压力时能够正常运行,性能压力测试成为一项不可或缺的活动。本文将介绍性能压力测试的重要性。 性能压力测试是一种通过模拟实际场景中的负荷和用户访问…

Echarts中饼状图,图例显示value而不是name

直接上代码 formatter(name) {var tarValue;for (var i 0; i < data.length; i) {if (data[i].name name) {tarValue data[i].value;}}var v tarValue;return [tarValue]} 效果图

spring boot 多模块项目搭建Knife4j文档,swagger-ui x2

介绍: knife4j jeecg-boot用的就是这个&#xff0c;我之前要搭过swagger-ui&#xff0c;但外观&#xff0c;体验都没有knife4j好&#xff0c;我没记错的话已经停止发布版本了&#xff0c;所以我的多模块项目就用到了这个&#xff0c;还搭建了jwt token获取我也是在网上找的…

260道2023最新网络安全工程师面试题(附答案)

2023年过去了一大半&#xff0c;先来灵魂三连问&#xff0c;年初定的目标完成多少了&#xff1f;薪资涨了吗&#xff1f;女朋友找到了吗&#xff1f; ​好了&#xff0c;不扎大家的心了&#xff0c;接下来进入正文。 由于我之前写了不少网络安全技术相关的文章和回答&#xff…

pdf文件如何生成长图?分享两个免费的方法给大家!

在某些情况下&#xff0c;我们可能需要将长图转换为PDF文件&#xff0c;以便更方便地分享和存档。本文将介绍两种免费的方法&#xff0c;帮助您实现这一目标。方法一是使用记灵在线工具的PDF转长图功能&#xff0c;方法二是利用PDF24工具进行转换。让我们一起来了解具体操作步骤…

blender 叶片制作

圆润叶片 效果展示 shift a 新建矩形&#xff0c;s y 延 y 轴方向压扁&#xff0c;ctrl r 循环切割&#xff0c;滚动滚轮&#xff0c;延 y 轴方向切两条循环线&#xff0c;框选点&#xff0c;s 缩放&#xff0c;调整到叶片造型&#xff0c;添加细分修改器&#xff1b;给叶片…

构建数据中台的三要素:方法论、组织和技术

知道要转型&#xff0c;要建设数据中台&#xff0c;却不知咋做&#xff0c;咋办&#xff1f; 现在有很多讲“如何建设数据中台”文章&#xff0c;观点各不相同&#xff1a; 数据中台是数据建设方法论&#xff0c;按照数据中台设计方法和规范实施就可建成数据中台数据中台背后…

WPF嵌入外部exe应用程序-去除子窗体边框样式

WPF嵌入外部exe应用程序-去除子窗体边框样式 去除子窗体边框样式导入winodows API使用API去除边框报错&#xff1a;解决实现效果 完整实现代码 接着上一篇WPF嵌入外部exe应用程序-实现基本的嵌入&#xff0c;解决子窗体边框样式问题,去掉子窗体样式&#xff0c;让其融为一体&am…

家政上门小程序|同城家政预约上门小程序开发|上门家政软件源码

随着生活水平的提高&#xff0c;越来越多的人开始借助家政服务来解决日常生活中的琐事。为了方便用户寻找和预约家政服务&#xff0c;家政上门小程序应运而生。家政上门小程序开发具有多种功能&#xff0c;使其成为家政服务行业的重要工具。本文将介绍一些家政上门小程序开发的…

品牌营销策略:如何有效打造品牌知名度与口碑?

品牌营销策略是企业在市场竞争中脱颖而出的重要手段&#xff0c;它能够帮助企业树立品牌形象&#xff0c;提升品牌知名度&#xff0c;增强品牌影响力&#xff0c;从而获得更多的市场份额和利润。那么&#xff0c;如何制定一套有效的品牌营销策略呢&#xff1f;以下是一秒推小编…

《向量数据库指南》:向量数据库Pinecone管理索引教程(一)

在本节中,我们将说明如何获取索引列表、创建索引、删除索引和描述索引。 要了解与索引相关的概念,请参见索引。 ⚠️警告 Starter(免费)计划上的索引将在7天的不活动后被删除。为了 防止这种情况,请发送任何API请求或登录控制台。这将计算为 活动。 获取有关您的索…

解决appium-doctor报 mjpeg-consumer cannot be found

解决appium-doctor报 mjpeg-consumer cannot be found npm i -g mjpeg-consumer

深入开箱跑分全志A523平板电脑 台电P26T

首先外观和观感就不说了&#xff0c;图都有&#xff0c;来看看内部实际的东西。 主控全志A523M00X0000&#xff0c;配套Android 13 5.15 Kernel系统。4G内存&#xff0c;64G eMMC&#xff0c;屏幕1280*800分辨率。 平板开启了安全启动所以想买来开发刷机可以歇歇了 &#xf…

C++基础项目实战之通讯录管理系统

赶时间的可以看改进版的通讯录管理系统 通讯录管理系统 文章目录 通讯录管理系统1. 系统需求2. 菜单功能3. 退出功能4. 添加联系人4.1 设计联系人结构体4.2 设计通讯录结构体 5. 显示联系人5.1 封装显示联系人函数 6. 删除联系人6.1 封装检测联系人是否存在6.2 封装删除联系人函…

再度合作|极智嘉(Geek+) P系列拣选机器人进驻CEVA欧洲物流中心

近日&#xff0c;3PL巨头CEVA Logistics首度在社交媒体展示其与极智嘉(Geek)合作打造的全新欧洲物流中心&#xff0c;并在推文中对极智嘉(Geek)给予了高度赞扬。CEVA表示&#xff0c;极智嘉不仅彻底颠覆了CEVA的工作环境&#xff0c;还充分保障了敬业员工的安全和人体工程学效率…

2.6 线性表的逆置

逆置: 将表中的元素调整成与原来相反的顺序. 1. 顺序表的逆置 图1. 顺序表的逆置 用temp存储要交换的元素, temp arr[ i ]; arr[ i ] arr[ j ]; arr[ j ] temp; 然后i, j--. 若数组长度为偶数, 则i > j时结束循环; 若数组长度为奇数, 则i > j时结束循环. 也即不管数…