Marshmallow 快速文档
Marshmallow
- Todo:
- 正文
- 1. 声明schema
- 2. 序列化对象 -- dumping
- 2.1 过滤输出 -- only
- 3. 反序列化 -- load
- 4. 处理对象集合(多个对象)
- 5. 必须值 required
- 5. 声明默认值
- 6. 只读和只写
- 7. 自定义key
本文主要对marshmallow的文档进行整理,并记录在学习Marshmallow文档时碰到的一些问题和解决方法
原文链接:https://marshmallow.readthedocs.io/en/stable/quickstart.html
Todo:
- 添加validation相关的内容
- 将内容按照接口重新排序
- 添加ordering, implicit field creation, nested schemas, custom field, extending schemas相关的内容
- 纠正翻译
正文
1. 声明schema
首先创建一个简单的User类,声明了构造方法和覆写__repr__方法用于打印对象
import datetime as dt
class User:def __init__(self, name, email):self.name = nameself.email = emailself.created_at = dt.datetime.now()def __repr__(self):return "<User(name={self.name!r})>".format(self=self)
然后创建一个继承Schema的UserSchema类,里面生成name,email,create_at变量,映射属性名到Field对象
from marshmallow import Schema, fieldsclass UserSchema(Schema):name = fields.Str()email = fields.Email()created_at = fields.DateTime()
也可以使用Schema.from_dict()通过传入dict来创建Schema。比较有用的应用场景是在运行中生成Schema
UserSchema = Schema.from_dict({"name": fields.Str(), "email": fields.Email(), "created_at": fields.DateTime()})
2. 序列化对象 – dumping
使用dump、dumps可以序列化对象。dump返回格式化好的数据,dumps返回json String
from pprint import pprintuser = User(name="Monty", email="monty@python.org")
schema = UserSchema()
result = schema.dump(user)
pprint(result)
# {"name": "Monty",
# "email": "monty@python.org",
# "created_at": "2014-08-17T14:54:16.049594+00:00"}
2.1 过滤输出 – only
使用only,传入tuple或者数组,可以指定输出的fields
summary_schema = UserSchema(only=("name", "email"))
summary_schema.dump(user)
# {"name": "Monty", "email": "monty@python.org"}
3. 反序列化 – load
dump反过来就是load,load会验证并反序列化一个字典 为 应用级别的数据结构。直接使用load,会将dict中的value转换成对应field定义的对象。
from pprint import pprintuser_data = {"created_at": "2014-08-11T05:26:03.869245","email": "ken@yahoo.com","name": "Ken",
}
schema = UserSchema()
result = schema.load(user_data)
pprint(result)
# {'name': 'Ken',
# 'email': 'ken@yahoo.com',
# 'created_at': datetime.datetime(2014, 8, 11, 5, 26, 3, 869245)},
如果想将dict整体转换为对象,需要在Schema 中声明一个方法并用@post_load装饰。下面的例子就是将dict转换成了User对象
from marshmallow import Schema, fields, post_loadclass UserSchema(Schema):name = fields.Str()email = fields.Email()created_at = fields.DateTime()@post_loaddef make_user(self, data, **kwargs):return User(**data)user_data = {"name": "Ronnie", "email": "ronnie@stones.com"}
schema = UserSchema()
result = schema.load(user_data)
print(result) # => <User(name='Ronnie')>
4. 处理对象集合(多个对象)
在创建Schema的时候,传入(many=True),让Schema可以处理多个对象
user1 = User(name="Mick", email="mick@stones.com")
user2 = User(name="Keith", email="keith@stones.com")
users = [user1, user2]
schema = UserSchema(many=True)
result = schema.dump(users) # OR UserSchema().dump(users, many=True)
pprint(result)
# [{'name': u'Mick',
# 'email': u'mick@stones.com',
# 'created_at': '2014-08-17T14:58:57.600623+00:00'}
# {'name': u'Keith',
# 'email': u'keith@stones.com',
# 'created_at': '2014-08-17T14:58:57.600623+00:00'}]
5. 必须值 required
在field中传入required,说明这个值不可或缺。如果缺少值的话,会报错。可以通过 error_messages={“required”: {“message”: “City required”, “code”: 400}} 来自定义错误返回的消息和错误码
from pprint import pprintfrom marshmallow import Schema, fields, ValidationErrorclass UserSchema(Schema):name = fields.String(required=True)age = fields.Integer(required=True, error_messages={"required": "Age is required."})city = fields.String(required=True,error_messages={"required": {"message": "City required", "code": 400}},)email = fields.Email()try:result = UserSchema().load({"email": "foo@bar.com"})
except ValidationError as err:pprint(err.messages)# {'age': ['Age is required.'],# 'city': {'code': 400, 'message': 'City required'},# 'name': ['Missing data for required field.']}
当一个schema用在不同地方时,required的值不同的话,通过load时传入partial=(“需要忽略的”),可以忽略required要求的字段值。
直接传入partial=True可以忽略所有的required
class UserSchema(Schema):name = fields.String(required=True)age = fields.Integer(required=True)result = UserSchema().load({"age": 42}, partial=("name",)) #跳过name
# OR UserSchema(partial=('name',)).load({'age': 42})
print(result) # => {'age': 42}result = UserSchema().load({"age": 42}, partial=True) #跳过所有
# OR UserSchema(partial=True).load({'age': 42})
print(result) # => {'age': 42}
5. 声明默认值
通过load_default和dump_default,声明默认值
class UserSchema(Schema):id = fields.UUID(load_default=uuid.uuid1)birthdate = fields.DateTime(dump_default=dt.datetime(2017, 9, 29))UserSchema().load({})
# {'id': UUID('337d946c-32cd-11e8-b475-0022192ed31b')}
UserSchema().dump({})
# {'birthdate': '2017-09-29T00:00:00+00:00'}
6. 只读和只写
在fields.str()中传入load_only=True是只写,dump_only=True是只读
class UserSchema(Schema):name = fields.Str()# password is "write-only"password = fields.Str(load_only=True)# created_at is "read-only"created_at = fields.DateTime(dump_only=True)
7. 自定义key
如果输入和输出的变量名不同,需要使用data_key=""自定义key的名称
class UserSchema(Schema):name = fields.String()email = fields.Email(data_key="emailAddress")s = UserSchema()data = {"name": "Mike", "email": "foo@bar.com"}
result = s.dump(data)
# {'name': u'Mike',
# 'emailAddress': 'foo@bar.com'}data = {"name": "Mike", "emailAddress": "foo@bar.com"}
result = s.load(data)
# {'name': u'Mike',
# 'email': 'foo@bar.com'}
Marshmallow 快速文档相关推荐
- 【快速文档】ad标签,我想通过小程序流量主赚钱,应该怎样做
流量主介绍 流量主是普通制作微信小程序的一个主要的盈利方式.主要就是通过放置广告.首先,我们要知道流量主的开通条件. 开通条件:小程序累计独立访客(UV)1000以上,且无违规记录,即可开通流量主功能 ...
- 《预训练周刊》第45期: 冻结语言模型、提示迁移性、快速文档排序
No.45 智源社区 预训练组 预 训 练 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息,<预训练周刊>已经开启"订阅功能",以后我们会向您自动推送最新版的&l ...
- 【快速文档】open-data标签,在小程序中无需用户授权也可以使用用户昵称和头像
介绍 按照现在的规定,在小程序中使用任何有关于用户的个人信息,都是需要授权的.但是,如果是通过open-data来使用用户的信息的话,则无需用户授权. 为什么open-data不需要授权呢,因为ope ...
- 【快速文档】text标签,可以放置文本的标签
重要参数 decode 进行转义,非必须,如果想转义,要填写 space 可以连续使用空格,非必须,如果要连续使用空格,要填写space="nbsp" 简单使用 text标签可以对 ...
- VIM快速文档整理技巧
VIM整理文档具有非常好的效果,我最近由于开发的需要,在网上收集了大量有关中中医的文章,需要整理优化调整成需要的格式,存入数据库中供前端调用.使用过WORD,excel等工具都不尽如意,后来使用VIM ...
- Swift字典Dictionary快速文档
Swift Dictionary字典 简述 字典就是通过Key - Value对应关系的数据结构. swift与OC字典区别 类型: Swift字典是值类型, OC字典类型为引用类型 初始化方法 ...
- 在线文档查看器:Gleamtech Document Viewer 6.6.1
DocumentUltimate Document Viewer and Converter for ASP.NET Core, MVC 和 WebForms 查看几乎任何文档类型(70 多种文件格式 ...
- 金山文档“闯关”协同办公,垂直类工具还有机会吗?
关注ITValue,看企业级最新鲜.最价值报道! 在协同办公市场,有了像钉钉.企业微信这样的综合性协同办公平台,其他更为垂直办公工具还有没有机会? 疫情让市场对这个问题给出了肯定的回答. " ...
- idea html注释,IntelliJ IDEA文档注释
IntelliJ IDEA 文档注释 IntelliJ IDEA 为创建文档注释提供了方便的功能. 您的源代码中的文档注释可用于快速文档查找并通过按 Ctrl + Q 打开以进行审阅. 在 Java ...
最新文章
- iOS APP提交上架最新流程
- 【原创】WP7.8 ROM更新图文并茂
- 如何制作快速加载的HTML页面
- Android Telephony分析(六) ---- 接口扩展(实践篇)
- 图解机器学习读书笔记-CH6
- 分段函数插值法c语言代码实验,实验名称插值法汇总.doc
- micro/protoc-gen-micro 不见了
- Kotlin——初级篇(二):变量、常量、注释
- Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出?
- 【游戏】基于matlab中国象棋【含Matlab源码 489期】
- 聚类算法效果衡量标准
- 七夕前夜,地球和月亮搭起“鹊桥”
- route路由失败,为何?
- MATCH和INDEX函数
- 怎么把多个pdf文件合并成一个pdf?
- [附源码]计算机毕业设计Python架构的博客平台设计(程序+源码+LW文档)
- 数据分析师出品:新媒体运营年终总结模板分享
- Eclipse设置三:设置豆绿色背景色
- DTT的生活就是对吃的一种细细品味
- 腾讯云API接口鉴权v3 鉴权失败问题 AuthFailure.SignatureFailure
热门文章
- PCB布局、布线总结(持续进行中。。。。。。)
- android图片压缩不失真实战
- rpc--sekiro框架
- 蓝桥杯复数运算python
- 比如说,你下午四点钟来。那么从三点钟起,我就开始感到幸福。时间越临近,我就越感到幸福。到了四点钟的时候,我就会坐立不安:我就会发现幸福的代价。...
- MATLAB中均值、方差、均方差的计算方法
- 三星note20u计算机功能,三星Note20Ultra隐藏功能有哪些,三星Note20Ultra使用教程
- 敏涵控股集团董事长刘敏:让世界了解敏涵 让敏涵走向世界
- OpenLayers3 地图图层(Layers) 详解
- 错误代码 missing-signature 错误原因: 缺少签名参数-自查方案