You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:05:03