如何在FastAPI中实现字符串到布尔值的类型转换?
实现字符串到布尔值的自动转换方案
要将"true"/"false"、"yes"/"no"、"on"/"off"、"1"/"0"、"y"/"n"这类字符串自动转换为布尔值,可通过以下两种Pydantic方案实现:
方案一:自定义布尔字段类型
通过继承bool类型并实现Pydantic的核心验证逻辑,创建可复用的自定义字段类型,适合多个模型或字段共享转换规则的场景:
from pydantic import BaseModel, GetCoreSchemaHandler from pydantic_core import core_schema from typing import Any class BoolStr(bool): @classmethod def __get_pydantic_core_schema__(cls, source_type: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema: def validate(value: Any) -> bool: # 已为布尔值直接返回 if isinstance(value, bool): return value # 处理字符串类型输入 if isinstance(value, str): lower_val = value.strip().lower() if lower_val in {'true', 'yes', 'on', '1', 'y'}: return True elif lower_val in {'false', 'no', 'off', '0', 'n'}: return False # 不支持的输入抛出错误 raise ValueError(f"无法将'{value}'转换为布尔值") return core_schema.no_info_plain_validator_function(validate) # 使用自定义类型定义模型 class Misc(BaseModel): # 是否弹出复选框 popup: BoolStr = False # 是否有待展示广告 advertPending: BoolStr = False
方案二:使用字段验证器
针对特定字段编写验证函数,在类型转换前完成字符串到布尔值的转换,适合单个模型内的局部字段处理:
Pydantic v2 版本
from pydantic import BaseModel, field_validator from typing import Any class Misc(BaseModel): popup: bool = False advertPending: bool = False @field_validator('popup', 'advertPending', mode='before') def str_to_bool(cls, value: Any) -> bool: if isinstance(value, bool): return value if isinstance(value, str): lower_val = value.strip().lower() if lower_val in {'true', 'yes', 'on', '1', 'y'}: return True elif lower_val in {'false', 'no', 'off', '0', 'n'}: return False raise ValueError(f"无效的布尔值字符串: '{value}'")
Pydantic v1 版本
from pydantic import BaseModel, validator from typing import Any class Misc(BaseModel): popup: bool = False advertPending: bool = False @validator('popup', 'advertPending', pre=True) def str_to_bool(cls, value: Any) -> bool: if isinstance(value, bool): return value if isinstance(value, str): lower_val = value.strip().lower() if lower_val in {'true', 'yes', 'on', '1', 'y'}: return True elif lower_val in {'false', 'no', 'off', '0', 'n'}: return False raise ValueError(f"无效的布尔值字符串: '{value}'")
说明
mode='before'(v2)或pre=True(v1)表示在Pydantic默认类型转换前执行自定义验证逻辑,确保字符串先被转换为布尔值再赋值给字段。- 两种方案都会自动处理GET参数传入的字符串,无需手动解析参数。
内容的提问来源于stack exchange,提问作者eri
相关产品推荐
相关产品推荐

