Marshmallow 库

news/2024/3/28 20:04:25/文章来源:https://blog.csdn.net/qq_55752792/article/details/129243362

文章目录

  • Marshmallow 库
    • 介绍
    • 使用
      • 序列化
      • 反序列化
    • 参数介绍
      • schema参数
      • fields 参数
    • 钩子函数
      • 内置验证器
    • Meta 属性

Marshmallow 库

介绍

marshmallow是一个用来将复杂的orm对象与python原生数据类型之间相互转换的库,简而言之,就是实现object -> dict, objects -> list, string -> dict 和 string -> list。
序列化:序列化的意思是将数据对象转化为可存储或可传输的数据类型 反序列化:将可存储或可传输的数据类型转化为数据对象
要进行序列化或反序列化,首先我们需要一个用来操作的object,这里我们先定义一个类:

import datetimeclass User:def __init__(self, name, age):self.name = nameself.age = ageself.c_time = datetime.datetime.now()

使用

序列化

  1. 通过 继承Schema 定义一个序列化类

    class UserSchema(Schema):name = fields.String()age = fields.Integer()c_time = fields.DateTime()
    
  2. 生成一个对象,进行序列化

    user = User("yxh", 20)
    # 生成 schema 对象
    schema = UserSchema()
    '''
    schema 对象序列化有两个方法dump()  返回 dict 格式数据dumps() 放回 json 格式数据
    '''
    print(schema.dump(user))
    # {'c_time': '2023-02-27T10:48:10.481042', 'age': 20, 'name': 'yxh'}
    print(schema.dumps(user))
    # {"c_time": "2023-02-27T10:48:10.481042", "age": 20, "name": "yxh"}
    

反序列化

res = {"name": "yxh", "c_time": "2023-02-27T10:51:06.713273", "age": 20}
print(schema.load(res))
# {'age': 20, 'name': 'yxh', 'c_time': datetime.datetime(2023, 2, 27, 10, 51, 6, 713273)}

对反序列化而言, 将传入的dict变成object更加有意义. 在Marshmallow中, dict -> object的方法需要自己实现, 然后在该方法前面加上一个装饰器post_load即可

class UserSchema(Schema):name = fields.String()age = fields.Integer()c_time = fields.DateTime()@post_loaddef make_user(self, data, **kwargs):data.pop("c_time")   # user 对象没有 c_time 字段return User(**data)res = '{"name": "yxh", "c_time": "2023-02-27T10:51:06.713273", "age": 20}'
item = schema.loads(res)
print(item)    #  <__main__.User object at 0x000002621BAB7588>

参数介绍

schema参数

demo

UserSchema(only={"name", "age"}) 
参数可以 在实例化 sechema 对象时配置,也可以在使用序列化/反序列化时 传入
schema.dump(users,many=True)
参数名作用补充
only指定序列化字段load_only/dump_only
exclude抛弃未知字段
many默认为False,批量序列化使用
partial忽略字段,可指定忽略字段,也可设置为True,就忽略传入字段外的其他字段通常在load()中使用,能够忽略 required = True 的字段

fields 参数

参数名作用补充
required默认为False,定义为True 时必传
validate指定校验方法
error_messages设置错误信息配合 required使用
attribute指定序列化时获取对象属性默认是字段名
load_from指定反序列化时字典key 对应的对象属性默认是字段名
data_keyattribute和load_from 结合体
default指定默认值
cls_or_instance用于可变类型嵌套
allow_none序列化/反序列化期间True是否None应被视为有效值。如果missing=None和allow_none未设置,则默认为True。否则,默认值为False。
metadata存储为元数据的额外参数
projects = fields.List(cls_or_instance=fields.Dict)
'''
特殊数据类型:
fields.Nested(nested, type, str, Callable[[], …) 类似于django中的外键序列化类型,用于使用额外的Schema序列化外键对象fields.Method(serialize, deserialize, **kwargs) 一个采用Schema方法返回值的字段。类似于django序列化器中的函数字段,可以通过方法构造一个完整的字段返回,该字段可以不是模型中存在的。fields.Function(serialize, Any], Callable[[Any, …) 接受函数返回值的字段。可将字段通过函数处理后将函数返回值作为该字段的值序列化返回。
'''

钩子函数

自定义反序列化校验函数函数

方案1:

def validate_name(name):if len(name) <=2:raise ValidationError("name长度必须大于2位")if len(name) >= 6:raise ValidationError("name长度不能大于6位")class UserSchema(Schema):name = fields.String(required=True, validate=validate_name)age = fields.Integer()c_time = fields.DateTime()        

方案2:

from marshmallow import Schema, fields, validatesclass UserSchema(Schema):name = fields.String(required=True)age = fields.Integer()c_time = fields.DateTime()   @validates("name")def validate_name(self, value):if len(value) <= 2:raise ValidationError("name长度必须大于2位")if len(value) >= 6:raise ValidationError("name长度不能大于6位")

内置验证器

validate.Email(*, error) 邮箱验证,error 表示可以替换内置的异常提示语,传入值为字符串。validate.Equal(comparable, *, error) 相等验证,验证输入值是否等于给定值validate.Length(min, max, *, equal, error) 长度验证,验证输入值的最大最小validate.OneOf(choices, labels, *, error) 选项验证,验证输入值是否属于选项validate.Range([min, max]) 范围验证validate.Regexp(regex, bytes, Pattern][, flags]) 正则验证validate.URL(*, relative, schemes, Set[str]] = None,) 验证是否为URL

Meta 属性

除了在生成 schema 对象是,传入参数,也可以在定义阶段通过 Meta 类来实现对属性的控制, 可定义类型常用 有 fileds 和 exclude 两个字段。

class Meta:fields = ("id", "email", "date_created")exclude = ("password", "secret_attribute")

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++常见类型及占用内存表

GPS生产厂家在定义数据的时候都会有一定的数据类型&#xff0c;例如double、int、float等&#xff0c;我们知道它们在内存中都对应了一定的字节大小&#xff0c;而我在实际使用时涉及到了端序的问题&#xff08;大端序高字节在前&#xff0c;小端序低字节在前&#xff09;&…

【ICCV2022】 CAPAO:一种高效的单阶段人体姿态估计模型

CAPAO&#xff1a;一种高效的单阶段人体姿态估计模型 重新思考关键点表示&#xff1a;将关键点和姿态建模作为多人姿态估计的对象&#xff08;Rethinking Keypoint Representations: Modeling Keypoints and Poses as Objects for Multi-Person Human Pose Estimation&#xf…

《数据库系统概论》学习笔记——第四章 数据库安全

教材为数据库系统概论第五版&#xff08;王珊&#xff09; 这一章简单记一下那几条sql的用法和两种存取控制和审计&#xff08;今年期末考了&#xff09;吧&#xff0c;不知道有啥好考的 数据库安全性 问题的提出 数据库的一大特点是数据可以共享数据共享必然带来数据库的安全…

idea远程调试线上jar包

有时候本地代码没问题但在线上运行会报错&#xff0c;这时候可以使用idea的remote功能调试线上jar包 步骤1 步骤2&#xff1a;新建remote 步骤3&#xff1a;配置服务器ip和端口 并复制生成的JVM参数供之后使用 步骤4&#xff1a;打jar包&#xff0c;并将生成的jar包放到服务…

Uncaught ReferenceError: jQuery is not defined

今天在拉取项目部署到本地的时候遇到了一个问题特此记录一下 &#xff08;以后闭坑&#xff09; 我和同事同时拉取了一样的代码&#xff0c;结果同事的页面加载正常而我的页面像被狗啃了一样&#xff0c;知道是js的问题但是不知道问题出在哪里&#xff1f;后来还是同事帮我解决…

栈与队列小结

一、理论基础1.队列是先进先出&#xff0c;栈是先进后出2.栈和队列是STL&#xff08;C标准库&#xff09;里面的两个数据结构。栈提供push和pop等等接口&#xff0c;所有元素必须符合先进后出规则&#xff0c;所以栈不提供走访功能&#xff0c;也不提供迭代器。3.栈是以底层容器…

CRM客户管理系统哪个好用?盘点前十名!

CRM客户管理系统排行&#xff1f;盘点前十名&#xff01; CRM客户管理系统是一种集成多种功能的软件系统&#xff0c;可以帮助企业跟进和管理客户关系、提高销售业绩、优化营销策略等。对于企业来说&#xff0c;选择一款适合自己的CRM系统非常重要&#xff0c;因为它能够直接影…

python之web自动化测试框架

梳理下搭建web自动化框架的流程&#xff1a; 创建目录&#xff1a; cases&#xff1a;存放测试用例&#xff0c;unittest框架要求用例名必须以test开头&#xff0c;所以命名test_case.py test_case.py代码如下&#xff1a;继承unittest.TestCase类下面的方法setupclass(),te…

学习 Python 之 Pygame 开发魂斗罗(六)

学习 Python 之 Pygame 开发魂斗罗&#xff08;六&#xff09;继续编写魂斗罗1. 创建碰撞类2. 给地图添加碰撞体3. 让人物可以掉下去4. 实现人物向下跳跃5. 完整的代码继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗&#xff08;五&#xff09;中&#xff0c;我…

感知趋势,洞察发展:2023(第十届)趋势与预测大会成功举办

2023年2月23日&#xff0c;运联年会&#xff1a;2023&#xff08;第十届&#xff09;趋势与预测大会在深圳机场凯悦酒店成功闭幕。自2014年开始&#xff0c;“运联年会&#xff1a;趋势与预测”已经连续举办九届。这场大会&#xff0c;既是一次行业性的“年终总结”&#xff0c…

(四)K8S 安装 Nginx Ingress Controller

ingress-nginx 是 Kubernetes 的入口控制器&#xff0c;使用NGINX作为反向代理和负载均衡器 版本介绍 版本1&#xff1a;Ingress NGINX Controller(k8s社区的ingres-nginx) 以 NGINX 开源技术为基础&#xff08;kubernetes.io&#xff09;&#xff0c;可在GitHub的 kubernet…

记一次java.lang.ClassNotFoundException问题排查过程

记一次java.lang.ClassNotFoundException问题排查过程 同事提供一个or-simulation-engine.jar包&#xff08;非maven项目&#xff0c;内部依赖很多其他jar&#xff0c;这个包是手动打出来的&#xff09;给我&#xff0c;我集成到我的springboot项目中&#xff0c;在本地IDEA启…

Telnet 基础实验1: Telnet 实验

Telnet 基础实验1&#xff1a; Telnet 实验 拓扑图 配置命令 R1 的配置 undo ter mo sys sys R1 interface g0/0/0 ip address 192.168.1.1 255.255.255.0 qR2 的配置 undo ter mo system-view sysname R2 interface g0/0/0 ip address 192.168.1.2 255.255.255.0 q两台设…

day21_IO

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、File 三、IO流 四、字节输入&输出流 零、 复习昨日 见晨考 一、作业 见答案二、File 2.1 介绍 File,通过一个路径代表文件或者文件夹 …

mysql(一) 使用注意事项及优化

初学mysql的时候、写了一份 "什么是CRUD&#xff1f; CRUD的操作" 的文章&#xff08;18年的&#xff09; 我开心看到有朋友经常在下面讨论一些问题、 但是以现在&#xff08;今天 23年&#xff09;回头看觉得 那些只是入门需要知道和掌握的、也刚好最近不是很忙 所…

区块链行业遭供应链攻击,上万加密钱包被“抄底”损失上亿美元

当地时间8月2日晚间&#xff0c; 区块链行业遭遇了一次行业重创 。据科技媒体TechCrunch报道&#xff0c; 若干名攻击者“抄底”了上万个加密钱包&#xff0c;钱包内有价值上亿美元的代币。 据了解遭受攻击的加密钱包包括Phantom、Slope和TrustWallet等。涉及到的币种除了SOL、…

网上招聘系统

技术&#xff1a;Java、JSP等摘要&#xff1a;当今&#xff0c;人类社会已经进入信息全球化和全球信息化、网络化的高速发展阶段。丰富的网络信息已经成为人们工作、生活、学习中不可缺少的一部分。人们正在逐步适应和习惯于网上贸易、网上购物、网上支付、网上服务和网上娱乐等…

为什么文档对 SaaS 公司至关重要?

在过去十年左右的时间里&#xff0c;SaaS的兴起使全球数百家公司成为家喻户晓的公司。但他们并不是仅仅依靠产品的力量到达那里的。客户服务和支持是使一切在幕后顺利进行的原因——其中很大一部分是文档。以正确的风格和正确的位置在您的网站上找到适当的用户文档对于将浏览器…

RNN相关知识总结

目录RNN结构与原理1.模型总览2.反向传播LSTM结构与原理1.模型总览2.如何解决RNN梯度消失/爆炸问题&#xff1f;GRU结构及原理1.模型总览LSTM与GRU的区别RNN结构与原理 1.模型总览 上图是RNN的展开结构图&#xff0c;由输入层、隐藏层和输出层组成。当前时间步t 的隐藏状态hth_…

【神经网络】Transformer基础问答

1.Transforme与LSTM的区别 transformer和LSTM最大的区别就是LSTM的训练是迭代的&#xff0c;无法并行训练&#xff0c;LSTM单元计算完T时刻信息后&#xff0c;才会处理T1时刻的信息&#xff0c;T 1时刻的计算依赖 T-时刻的隐层计算结果。而transformer的训练是并行了&#xff0…