悠悠楠杉
网站页面
正文:
在实际开发中,我们经常需要处理前端传来的字符串形式的布尔值(如"true"、"false"、"1"、"0"等)。FastAPI结合Pydantic虽然提供了强大的类型系统,但默认情况下无法自动完成这类特殊转换。如何优雅地解决这个问题?以下是几种实用方案。
通过Pydantic的validator装饰器,可以轻松扩展字段的解析逻辑:
from pydantic import BaseModel, validator
class RequestModel(BaseModel):
flag: bool
@validator('flag', pre=True)
def parse_bool(cls, v):
if isinstance(v, str):
return v.lower() in ('true', '1', 'yes')
return v
优点:灵活支持多种字符串格式;缺点:需为每个模型重复编写验证器。
bool类型创建自定义布尔类型,覆盖默认解析行为:
from pydantic import BaseModel
class FlexibleBool(bool):
@classmethod
def __get_validators__(cls):
yield cls.validate
@classmethod
def validate(cls, v):
if isinstance(v, str):
return v.lower() in ('true', '1')
return bool(v)
class RequestModel(BaseModel):
flag: FlexibleBool
适用场景:需全局统一布尔值解析规则时。
constr与逻辑组合通过constr限制输入格式后转换:
from pydantic import BaseModel, constr, validator
class RequestModel(BaseModel):
flag_str: constr(regex=r'^(true|false|1|0)$')
@property
def flag(self):
return self.flag_str.lower() in ('true', '1')
特点:显式分离原始输入和转换结果,适合需要保留原始数据的场景。
通过合理选择模式,既能保证数据一致性,又能提升接口的容错性。