Marshmallow 库
文章目录
- 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()
使用
序列化
通过 继承
Schema
定义一个序列化类class UserSchema(Schema):name = fields.String()age = fields.Integer()c_time = fields.DateTime()
生成一个对象,进行序列化
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_key | attribute和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")
Marshmallow 库相关推荐
- marshmallow库的简单学习
marshmallow库的简单学习 一.简单说明 二.创建Schema类 三.序列化和反序列化 1.定义 2.序列化 3.反序列化 4.部分序列化 5.部分反序列化(这部分应放在特殊用法) 四.数据校 ...
- Python 中更优雅的环境变量设置方案
本文授权转载自公众号:进击的Coder 在运行一个项目的时候,我们经常会遇到设置不同环境的需求,如设置是开发环境.测试环境还是生产环境,或者在某些设置里面可能还需要设置一些变量开关,如设置调试开关.日 ...
- fastapi——简单快速入门
fastapi--快速入门笔记 根据慕课网视频教程 地址:https://www.bilibili.com/video/BV1iN411X72b?p=36 print("\033[31m5. ...
- python实现即时通讯后端思路整理
公司同事写的即时通讯系统,感觉他数据库设计的不合理,所以我准备模拟一下场景,自己设计一下架构,如果继续闲着,就弄个git项目,验证所学. 一.后端数据存储的选择 本来想使用redis或者mongodb ...
- Windows API参考大全
第一章 Win32 API概论 1.1为什么使用 Wu32 API 在Windows程序设计领域处于发展初期时,Windows程序员可使用的编程工具唯有API 函数.这些函数在程序员手中犹如" ...
- python那么多库怎么学_这个 Python 库有必要好好学学
" 阅读本文大概需要 6 分钟. " 在很多情况下,我们会有把 Python 对象进行序列化或反序列化的需求,比如开发 REST API,比如一些面向对象化的数据加载和保存,都会应 ...
- 华为python有必要学吗_【华为云技术分享】这个 Python 库有必要好好学学
这里看一个最基本的例子,这里给到一个 User 的 Class 定义,再给到一个 data 数据,像这样: 1 class User(object):2 def __init__(self, name ...
- MongoDB 资源、库、工具、应用程序精选列表中文版
推荐阅读 MongoDB 资源.库.工具.应用程序精选列表中文版 有哪些鲜为人知,但是很有意思的网站? 一份攻城狮笔记 每天搜集 Github 上优秀的项目 一些有趣的民间故事 超好用的谷歌浏览器.S ...
- 这个 Python 库有必要好好学学
在很多情况下,我们会有把 Python 对象进行序列化或反序列化的需求,比如开发 REST API,比如一些面向对象化的数据加载和保存,都会应用到这个功能. 这里看一个最基本的例子,这里给到一个 Us ...
最新文章
- python-docx表格设置实线_python docx加入表格 在表格中加图,设置框线
- Chimera 嵌合体
- Error response from daemon: Conflict. The container name /mysql is already in use by container
- php文件手机怎么解压,linux 怎么解压文件
- 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc
- idea gui插件_给IDEA换个酷炫的主题,这个有点哇塞啊!
- C#位图BitArray 小试牛刀
- 08.MyBatis整合Log4j
- DIY高清云台(吊舱)方案
- 如何使用“启动转换”从 Mac 上移除 Windows?
- linux fread函数的用法,fread和fwrite用法详解
- keras实现交叉验证以及K折交叉验证
- MFC版 黄金矿工 游戏开发记录
- python 泰森多边形边界_泰森多边形
- 2019规划:放下所有,轻松上阵,大胆尝试,勇于实践,经商赚钱,考证提高,随时煅炼
- 如何保证同事的代码不会腐烂?一文带你了解 Alibaba COLA 架构
- oracle times ten 学习笔记
- Matlab中的clc、clear、clear all、clf、close、close all解释
- 大数据学习,Scala快速学习的方法
- 关于租车问题的java视频_Java第二季-答答租车系统(不合理的地方,请大家拍砖)...