文章目录

  • 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_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 库相关推荐

  1. marshmallow库的简单学习

    marshmallow库的简单学习 一.简单说明 二.创建Schema类 三.序列化和反序列化 1.定义 2.序列化 3.反序列化 4.部分序列化 5.部分反序列化(这部分应放在特殊用法) 四.数据校 ...

  2. Python 中更优雅的环境变量设置方案

    本文授权转载自公众号:进击的Coder 在运行一个项目的时候,我们经常会遇到设置不同环境的需求,如设置是开发环境.测试环境还是生产环境,或者在某些设置里面可能还需要设置一些变量开关,如设置调试开关.日 ...

  3. fastapi——简单快速入门

    fastapi--快速入门笔记 根据慕课网视频教程 地址:https://www.bilibili.com/video/BV1iN411X72b?p=36 print("\033[31m5. ...

  4. python实现即时通讯后端思路整理

    公司同事写的即时通讯系统,感觉他数据库设计的不合理,所以我准备模拟一下场景,自己设计一下架构,如果继续闲着,就弄个git项目,验证所学. 一.后端数据存储的选择 本来想使用redis或者mongodb ...

  5. Windows API参考大全

    第一章 Win32 API概论 1.1为什么使用 Wu32 API 在Windows程序设计领域处于发展初期时,Windows程序员可使用的编程工具唯有API 函数.这些函数在程序员手中犹如" ...

  6. python那么多库怎么学_这个 Python 库有必要好好学学

    " 阅读本文大概需要 6 分钟. " 在很多情况下,我们会有把 Python 对象进行序列化或反序列化的需求,比如开发 REST API,比如一些面向对象化的数据加载和保存,都会应 ...

  7. 华为python有必要学吗_【华为云技术分享】这个 Python 库有必要好好学学

    这里看一个最基本的例子,这里给到一个 User 的 Class 定义,再给到一个 data 数据,像这样: 1 class User(object):2 def __init__(self, name ...

  8. MongoDB 资源、库、工具、应用程序精选列表中文版

    推荐阅读 MongoDB 资源.库.工具.应用程序精选列表中文版 有哪些鲜为人知,但是很有意思的网站? 一份攻城狮笔记 每天搜集 Github 上优秀的项目 一些有趣的民间故事 超好用的谷歌浏览器.S ...

  9. 这个 Python 库有必要好好学学

    在很多情况下,我们会有把 Python 对象进行序列化或反序列化的需求,比如开发 REST API,比如一些面向对象化的数据加载和保存,都会应用到这个功能. 这里看一个最基本的例子,这里给到一个 Us ...

最新文章

  1. python-docx表格设置实线_python docx加入表格 在表格中加图,设置框线
  2. Chimera 嵌合体
  3. Error response from daemon: Conflict. The container name /mysql is already in use by container
  4. php文件手机怎么解压,linux 怎么解压文件
  5. 狄斯奎诺算法 c语言,图的邻接表实现迪杰斯特拉算法(C语言).doc
  6. idea gui插件_给IDEA换个酷炫的主题,这个有点哇塞啊!
  7. C#位图BitArray 小试牛刀
  8. 08.MyBatis整合Log4j
  9. DIY高清云台(吊舱)方案
  10. 如何使用“启动转换”从 Mac 上移除 Windows?
  11. linux fread函数的用法,fread和fwrite用法详解
  12. keras实现交叉验证以及K折交叉验证
  13. MFC版 黄金矿工 游戏开发记录
  14. python 泰森多边形边界_泰森多边形
  15. 2019规划:放下所有,轻松上阵,大胆尝试,勇于实践,经商赚钱,考证提高,随时煅炼
  16. 如何保证同事的代码不会腐烂?一文带你了解 Alibaba COLA 架构
  17. oracle times ten 学习笔记
  18. Matlab中的clc、clear、clear all、clf、close、close all解释
  19. 大数据学习,Scala快速学习的方法
  20. 关于租车问题的java视频_Java第二季-答答租车系统(不合理的地方,请大家拍砖)...

热门文章

  1. 【小波变换】小波变换入门----haar小波
  2. ddos流量攻击有多少G_攻击流量超过300G,遭遇DDoS时我们能做些什么?
  3. SpringBoot项目的两种打包方式分析
  4. 计算机动作路径教案,《引导路径动画》教案
  5. 25-36.产品经理入门到精通(三)
  6. 外国人眼里的李子柒难道不一样? | Alfred数据室
  7. Oracle数据库中的级联查询、级联删除、级联更新操作教程
  8. CloudBu面试题
  9. adaboost训练 之 弱分类器训练原理
  10. Google、Facebook的工程师文化到底是什么?