Schema

Schema 用于声明数据的类型、结构及验证规则等,并提供了序列化及反序列化的功能。Schema 可以声明一个整数,或是列表,还可以是一个复杂的对象。按照功能功能划分,本文档将 Schema 的说明分为 Model Schema 和一般 Schema。

本篇内容将介绍 Schema 的通用功能。

序列化

序列化的目的是为了将 Python 对象转换为外部可识别的数据。

Schema 可以序列化一个简单的数据类型:

>>> from django_oasis import schema
>>> from datetime import datetime

>>> schema.Datetime().serialize(datetime(2023, 1, 1))
'2023-01-01T00:00:00'

也可以是一个复杂的对象:

>>> class UserSchema(schema.Model):
...     name = schema.String()
...     created_at = schema.Datetime()

>>> UserSchema().serialize({'name': '张三', 'created_at': datetime(2023, 1, 1)})
{'name': '张三', 'created_at': '2023-01-01T00:00:00'}

反序列化

这是序列化的逆向操作,即将一个数据转换为 Python 对象。

>>> schema.Datetime().deserialize('2023-01-01T00:00:00')
datetime.datetime(2023, 1, 1, 0, 0)

>>> UserSchema().deserialize({'name': '张三', 'created_at': '2023-01-01'})
{'name': '张三', 'created_at': datetime.datetime(2023, 1, 1, 0, 0)}

在反序列化的过程中会对数据进行验证,稍后会在 验证数据 章节做详细说明。

choices

验证值是否等于选项序列中的一个。该序列中的元素应该是唯一的。

若值在选项内,将正常输出:

fruit = schema.String(choices=['apple', 'watermelon', 'grape'])

print(fruit.deserialize('apple'))
apple

若值不在选项内,将抛出异常:

fruit.deserialize('banana')
Traceback (most recent call last):
    ...
django_oasis_schema.exceptions.ValidationError: [{'msgs': ["The value must be one of 'apple', 'watermelon', 'grape'."]}]

备注

OAS: 该参数会映射为 enum 关键字。

after_deserialization

反序列化后置处理函数。

如用于去除字符串前后多余的空白符:

email = schema.String(after_deserialization=str.strip)
print(repr(email.deserialize('123@example.com  ')))
'123@example.com'