跳到主要内容

验证器

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
)