文章目录
- marshmallow:Python 对象序列化,一个库就够了
- 1、 这玩意儿是干嘛的
- 2、 为什么要用它
- 3、 怎么用
- 4、 适合哪些人用
marshmallow:Python 对象序列化,一个库就够了
marshmallow 在 GitHub 上已经拿到 7,240 Star 了。
这是一个 ORM/ODM/框架无关的 Python 库,核心功能就是一件事:把复杂数据类型(比如对象)和原生 Python 数据类型做互相转换。你从数据库查出对象要返回给前端,ORM 返回的是 model 对象,不能直接 JSON 序列化。手动挨个字段写 dict,写多了手疼。
1、 这玩意儿是干嘛的
就一件事:序列化和反序列化,附带输入校验。
定义一套 Schema,字段名称和类型声明清楚,dump一下出 dict,再 render 成 JSON。前端传数据回来,load一下又变回对象。日期格式、嵌套关系、字段校验,都在 Schema 里声明完事。
2、 为什么要用它
写过 API 的人都懂:一个 User 对象十几个字段,外键关联了 Profile、Settings,手动序列化每加一个字段就得改两处。
日期格式要不要转字符串?嵌套对象怎么展开?前端传过来的数据合不合法?这些边界情况堆在一起,序列化代码很快就变成浆糊。
marshmallow 用 Schema 声明式描述数据结构,嵌套关系用fields.Nested搞定,日期自动格式化,输入自动校验。代码量和心智负担都降下来了。
3、 怎么用
核心就是定义 Schema:
frommarshmallowimportSchema,fieldsclassArtistSchema(Schema):name=fields.Str()classAlbumSchema(Schema):title=fields.Str()release_date=fields.Date()artist=fields.Nested(ArtistSchema())album=dict(artist=dict(name="David Bowie"),title="Hunky Dory",release_date=date(1971,12,17))schema=AlbumSchema()result=schema.dump(album)# {'artist': {'name': 'David Bowie'},# 'release_date': '1971-12-17',# 'title': 'Hunky Dory'}Schema 同时承担序列化、反序列化、校验三个角色,一个定义到处用。
安装:
pipinstall-Umarshmallow4、 适合哪些人用
- 写 Python Web API、需要频繁做对象序列化的开发者
- 用 Flask、Django、FastAPI,需要独立序列化层的人
- 项目中涉及复杂嵌套数据和多字段校验的场景
发者
- 用 Flask、Django、FastAPI,需要独立序列化层的人
- 项目中涉及复杂嵌套数据和多字段校验的场景