建立Schema

marshmallow对于对象的实例化是通过Schema来完成的,建立Schema是对对象进行序列化和反序列化的第一步。marshmallow提供了一个Schema类,用来作为自定义Schema类的基类。

自定义Schema类中,需要定义要输出的成员属性,成员属性名称尽量与被序列化类中的成员属性名称相同。Schema类中的成员属性使用marshmallow模块中提供的fields模块中的类进行声明。

以下给出一个Schema示例。

import datatime as dt
from marshmallow import Schema, fields

# 假设有这样一个需要序列化的类
class User(object):
	def __inti__(self, name, age, email):
		self.name = name
		self.email = email
		self.age = age
		self.create_at = dt.datetime.now()

# 可以创建以下这个对应的Schema
class UserSchema(Schema):
	name = fields.Str()
	email = fields.Email()
	age = fields.Int()
	create_at = fields.DateTime()

fields模块中的类一般都采用以下共同的初始化参数,可以在声明成员属性时进行更加精细的调整。

参数名类型功能
default由内容确定当相应的输入值不存在时,使用指定默认值替代。
attributestr在序列化时指定对应的被序列化实例中的属性名。
data_keystr在反序列化时对应序列化内容中的键名。
validatecallable指定反序列化时该属性的验证器,如果验证器返回False则抛出ValidationError
requiredbool是否必须存在。
allow_nonebool是否允许空值。
load_onlybool序列化时跳过本属性。
dump_onlybool反序列化时跳过本属性。
missing由内容确定指定当反序列化时,该属性不存在时的默认值。

常用的属性声明类及其特殊的初始化参数有以下这些,可以在实际项目中选择使用。

  • Raw(),不使用任何格式化及验证方式的属性。
  • Nested(),使用其他的Schema来处理本属性,第一个参数需要指定要使用的Schema类。
    • nested,要使用的Schema类。
    • exlcude,元组类型,用于从排除不需要处理的属性。
    • only,元组类型,用于指定仅要包含的属性。
    • many,布尔类型,用于指示该属性的值是一个序列。
  • Dict(),字典类型属性。
  • List(),列表类型属性,第一个参数用于指定组成序列的其他Field类型,注意要与Nested()区分开。
  • String(),字符串类型属性,可简写为Str()
  • UUID(),UUID类型属性。
  • Number(),数值类型属性。
    • as_string,布尔类型,用于指示是否将数值按照字符串形式输出。
  • Integer(),整型属性,可简写为Int()
  • Decimal()decimal.Decimal类型属性,用于高精度小数计算。
    • places,数值位数。
    • rounding,取整进位模式。
    • allow_nan,是否允许非数字类型。
  • Boolean(),布尔类型属性,可简写为Bool()
  • FormattedString(),格式化字符串属性。接受一个格式化字符串作为属性,可以输出其他Field的内容。
  • Float(),浮点类型属性。
  • DataTime(),时间类型属性,接受一个格式化字符串来进行时间格式化。
  • LocalDateTime(),本地化时间类型属性。
  • Time(),时间类型属性。
  • Date(),日期类型属性。
  • TimeDelta(),时间域类型属性。
    • prescision,字符串类型,用于指定时间域的单位。
  • URL(),URL字符串属性。
  • Email(),带有Email验证器的字符串属性。
  • Method(),使用Schema中定义的方法来进行转换,需要分别指定序列化方法和反序列化方法。
  • Function(),使用其他位置定义的函数来进行转换,需要分别指定序列化函数和反序列化函数。
  • Constant(),固定值属性。

此外,Schema中还可以使用修饰器来修饰一些方法来在序列化和反序列化前后进行额外的处理工作。常用的有:

  • @post_dump,序列化后运行。
  • @post_load,反序列化后运行。
  • @pre_dump,序列化前运行。
  • @pre_load,反序列化前运行。
  • @validates(field_name),注册指定属性的验证器。