验证器
QueryParams和Data模型都可以从Pydantic验证器的战术使用中受益。 本页面将概述它们部署的一些关键场景。
总的来说,它们有助于强制执行Fast API对输入和输出的合规性, 并且它们在输出前的最后转换阶段工作。
使用它们的一些情况包括:
- 转换、符合或以其他方式更改输入的查询参数或返回的数据值。
- 查询参数或数据字段是日期。
- 查询参数需要动态默认状态。
- 标准化百分比值。
- 清理NaN值。
示例
从Pydantic库导入的项目是:
from pydantic import field_validator, model_validator
解析日期
提供商将以多种方式格式化日期。OpenBB使用YYYY-MM-DD作为输入和输出的标准约定。
输出是datetime
对象或JSON序列化字符串。验证器用于从特定格式解析日期。
此示例在提供商的Data
模型中使用。
@field_validator("last_trade_timestamp", mode="before", check_fields=False)
@classmethod
def parse_timestamp(cls, v):
"""解析Unix时间戳。"""
return datetime.fromtimestamp(v)
标准化百分比值
在提供商级别,我们希望标准化表示百分比的值的返回方式。
我们的意图是确保这些值可以直接用于公式而无需转换。
此示例将在提供商的Data
模型中使用。
@field_validator("change_percent", mode="before", check_fields=False)
@classmethod
def normalize_percent(cls, v):
"""标准化百分比。"""
return v / 100 if v else None
动态默认日期
可能希望有一个非静态的默认日期参数。为了允许这样做,我们必须将默认参数值设置为None
,并使用model_validator
。此示例适用于QueryParams
。
@model_validator(mode="before")
@classmethod
def validate_dates(cls, values) -> dict:
"""验证查询参数。"""
if values.get("start_date") is None:
values["start_date"] = (datetime.now() - timedelta(days=90)).date()
if values.get("end_date") is None:
values["end_date"] = datetime.now().date()
return values
用None替换0
有时值作为0
返回,但实际上应该是null
。
此示例查看整个Data
模型,但可以轻松适应用于单个字段。
@model_validator(mode="before")
@classmethod
def replace_zero(cls, values):
"""检查零值并用None替换。"""
return (
{k: None if v == 0 else v for k, v in values.items()}
if isinstance(values, dict)
else values
)