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 快速文档相关推荐

  1. 【快速文档】ad标签,我想通过小程序流量主赚钱,应该怎样做

    流量主介绍 流量主是普通制作微信小程序的一个主要的盈利方式.主要就是通过放置广告.首先,我们要知道流量主的开通条件. 开通条件:小程序累计独立访客(UV)1000以上,且无违规记录,即可开通流量主功能 ...

  2. 《预训练周刊》第45期: 冻结语言模型、提示迁移性、快速文档排序

    No.45 智源社区 预训练组 预 训 练 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息,<预训练周刊>已经开启"订阅功能",以后我们会向您自动推送最新版的&l ...

  3. 【快速文档】open-data标签,在小程序中无需用户授权也可以使用用户昵称和头像

    介绍 按照现在的规定,在小程序中使用任何有关于用户的个人信息,都是需要授权的.但是,如果是通过open-data来使用用户的信息的话,则无需用户授权. 为什么open-data不需要授权呢,因为ope ...

  4. 【快速文档】text标签,可以放置文本的标签

    重要参数 decode 进行转义,非必须,如果想转义,要填写 space 可以连续使用空格,非必须,如果要连续使用空格,要填写space="nbsp" 简单使用 text标签可以对 ...

  5. VIM快速文档整理技巧

    VIM整理文档具有非常好的效果,我最近由于开发的需要,在网上收集了大量有关中中医的文章,需要整理优化调整成需要的格式,存入数据库中供前端调用.使用过WORD,excel等工具都不尽如意,后来使用VIM ...

  6. Swift字典Dictionary快速文档

    Swift Dictionary字典 简述 字典就是通过Key - Value对应关系的数据结构. swift与OC字典区别 ​ 类型: Swift字典是值类型, OC字典类型为引用类型 初始化方法 ...

  7. 在线文档查看器:Gleamtech Document Viewer 6.6.1

    DocumentUltimate Document Viewer and Converter for ASP.NET Core, MVC 和 WebForms 查看几乎任何文档类型(70 多种文件格式 ...

  8. 金山文档“闯关”协同办公,垂直类工具还有机会吗?

    关注ITValue,看企业级最新鲜.最价值报道! 在协同办公市场,有了像钉钉.企业微信这样的综合性协同办公平台,其他更为垂直办公工具还有没有机会? 疫情让市场对这个问题给出了肯定的回答. " ...

  9. idea html注释,IntelliJ IDEA文档注释

    IntelliJ IDEA 文档注释 IntelliJ IDEA 为创建文档注释提供了方便的功能. 您的源代码中的文档注释可用于快速文档查找并通过按 Ctrl + Q 打开以进行审阅. 在 Java ...

最新文章

  1. iOS APP提交上架最新流程
  2. 【原创】WP7.8 ROM更新图文并茂
  3. 如何制作快速加载的HTML页面
  4. Android Telephony分析(六) ---- 接口扩展(实践篇)
  5. 图解机器学习读书笔记-CH6
  6. 分段函数插值法c语言代码实验,实验名称插值法汇总.doc
  7. micro/protoc-gen-micro 不见了
  8. Kotlin——初级篇(二):变量、常量、注释
  9. Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出?
  10. 【游戏】基于matlab中国象棋【含Matlab源码 489期】
  11. 聚类算法效果衡量标准
  12. 七夕前夜,地球和月亮搭起“鹊桥”
  13. route路由失败,为何?
  14. MATCH和INDEX函数
  15. 怎么把多个pdf文件合并成一个pdf?
  16. [附源码]计算机毕业设计Python架构的博客平台设计(程序+源码+LW文档)
  17. 数据分析师出品:新媒体运营年终总结模板分享
  18. Eclipse设置三:设置豆绿色背景色
  19. DTT的生活就是对吃的一种细细品味
  20. 腾讯云API接口鉴权v3 鉴权失败问题 AuthFailure.SignatureFailure

热门文章

  1. PCB布局、布线总结(持续进行中。。。。。。)
  2. android图片压缩不失真实战
  3. rpc--sekiro框架
  4. 蓝桥杯复数运算python
  5. 比如说,你下午四点钟来。那么从三点钟起,我就开始感到幸福。时间越临近,我就越感到幸福。到了四点钟的时候,我就会坐立不安:我就会发现幸福的代价。...
  6. MATLAB中均值、方差、均方差的计算方法
  7. 三星note20u计算机功能,三星Note20Ultra隐藏功能有哪些,三星Note20Ultra使用教程
  8. 敏涵控股集团董事长刘敏:让世界了解敏涵 让敏涵走向世界
  9. OpenLayers3 地图图层(Layers) 详解
  10. 错误代码 missing-signature 错误原因: 缺少签名参数-自查方案