前几部分文档大致描述了如何使用Flask_SQLArchemy对数据进行操作,但是操作起来都是基于对象的,这时候就可以引入Marshmallow进行序列化与反序列化操作。
Marshmallow作用
在Python中,Marshmallow(棉花糖)是一个用于对象序列化(Object Serialization)和反序列化(Object Deserialization)的库。它主要用于处理数据对象与数据存储或交换格式之间的转换,例如将对象转换为 JSON 格式以进行网络传输或持久化存储,以及从 JSON 数据中还原对象。 功能包括:
- 对象序列化(Serialization): Marshmallow可以将复杂的数据对象转换为可以存储或传输的格式,如 JSON。这对于将对象转换为特定格式以进行数据交换或存储在数据库中非常有用。
- 对象反序列化(Deserialization): Marshmallow可以从存储或传输的格式还原数据对象。这对于从外部数据源(如网络请求、文件、数据库)中读取数据并将其转换为应用程序中的对象非常有用。
- 数据验证(Data Validation): Marshmallow还提供了数据验证的功能,确保数据符合预期的格式和规范。这有助于确保输入数据的完整性和一致性。
- 处理复杂嵌套关系(Handling Complex Nesting): 当你的数据对象包含复杂的嵌套关系时,Marshmallow能够很好地处理这些情况,确保序列化和反序列化的正确性。
- Web框架的集成: Marshmallow通常与许多Python的Web框架(如Flask、Django等)一起使用,以简化处理Web请求和响应中的数据序列化和反序列化的过程。
Schema示例
对应model模块,可以创建一个Marshmallow的schema模块
schema.py
from marshmallow import Schema, fields
class BaseSchema(Schema):
id = fields.Integer(dump_only=True)
class AccountSchema(BaseSchema):
account_name = fields.String(required=True)
account_email = fields.String(required=True)
profile = fields.Nested('ProfileSchema', exclude=('account',))
class ProfileSchema(BaseSchema):
fullname = fields.String()
gender = fields.String()
account_id = fields.Integer()
class ProjectSchema(BaseSchema):
project_name = fields.String(required=True)
project_webhook = fields.String()
hosts = fields.Nested('HostSchema', many=True, exclude=('project',))
accounts = fields.Nested('AccountSchema', many=True, exclude=('projects',))
class HostSchema(BaseSchema):
hostname = fields.String()
ip = fields.String()
project_id = fields.Integer()
字段field
以下是常用的schema字段field说明
AwareDateTime([format, default_timezone]) |
A formatted aware datetime string. |
格式化的可识别日期时间字符串。 |
Bool |
alias of Boolean |
布尔字段别名。 |
Boolean(*[, truthy, falsy]) |
A boolean field. |
布尔字段。 |
Constant(constant, **kwargs) |
A field that (de)serializes to a preset constant. |
(反)序列化为预设常量的字段。 |
Date([format]) |
ISO8601-formatted date string. |
ISO8601格式的日期字符串。 |
DateTime([format]) |
A formatted datetime string. |
格式化的日期时间字符串。 |
Decimal([places, rounding, allow_nan, as_string]) |
A field that (de)serializes to the Python decimal.Decimal type. |
(反)序列化为 Python 类型的字段。decimal.Decimal |
Dict([keys, values]) |
A dict field. |
字典字段。 |
Email(*args, **kwargs) |
An email field. |
邮件字段。 |
Enum(enum, *[, by_value]) |
An Enum field (de)serializing enum members by symbol (name) or by value. |
枚举字段(反序列化)按符号(名称)或值序列化枚举成员。 |
Field(*, load_default, missing, ...) |
Basic field from which other fields should extend. |
其他字段应从中扩展的基本字段。 |
Float(*[, allow_nan, as_string]) |
A double as an IEEE-754 double precision string. |
作为IEEE-754双精度字符串 |
Function([serialize, deserialize]) |
A field that takes the value returned by a function. |
一个字段,该字段采用函数返回的值。 |
IP(*args[, exploded]) |
A IP address field. |
IP 地址字段。 |
IPInterface(*args[, exploded]) |
A IPInterface field. |
网络接口 字段。 |
IPv4(*args[, exploded]) |
A IPv4 address field. |
IPv4 地址字段。 |
IPv4Interface(*args[, exploded]) |
A IPv4 Network Interface field. |
IPv4 网络接口字段。 |
IPv6(*args[, exploded]) |
A IPv6 address field. |
IPv6 地址字段。 |
IPv6Interface(*args[, exploded]) |
A IPv6 Network Interface field. |
IPv6 网络接口字段。 |
Int |
alias of Integer |
证书字段别名。 |
Integer(*[, strict]) |
An integer field. |
整数字段。 |
List(cls_or_instance, **kwargs) |
A list field, composed with another Field class or instance. |
列表字段,由另一个类或实例组成。 |
Mapping([keys, values]) |
An abstract class for objects with key-value pairs. |
具有键值对的对象的抽象类。 |
Method([serialize, deserialize]) |
A field that takes the value returned by a Schema method. |
一个字段,该字段采用Schema方法返回的值。 |
NaiveDateTime([format, timezone]) |
A formatted naive datetime string. |
格式化的原生日期时间字符串。 |
Nested(nested, ...) |
Allows you to nest a Schema inside a field. |
允许您在字段中嵌套一个Schema。 |
Number(*[, as_string]) |
Base class for number fields. |
数字字段的基类。 |
Pluck(nested, field_name, **kwargs) |
Allows you to replace nested data with one of the data's fields. |
允许您将嵌套数据替换为数据的字段之一。 |
Raw(*, load_default, missing, dump_default, ...) |
Field that applies no formatting. |
RAW格式字段。 |
Str |
alias of String |
字符串字段别名。 |
String(*, load_default, missing, ...) |
A string field. |
字符串字段。 |
Time([format]) |
A formatted time string. |
格式化的时间字符串。 |
TimeDelta(precision, serialization_type, ...) |
A field that (de)serializes a datetime.timedelta object to an integer or float and vice versa. |
将对象(反)序列化为整数或浮点数的字段,反之亦然。 |
Tuple(tuple_fields, *args, **kwargs) |
A tuple field, composed of a fixed number of other Field classes or instances |
元组字段,由固定数量的其他类或实例组成 |
URL |
alias of Url |
URL 字段别名。 |
UUID(*, load_default, missing, dump_default, ...) |
A UUID field. |
一个 UUID 字段。 |
Url(*[, relative, absolute, schemes, ...]) |
An URL field. |
URL 字段。 |