如何在FastAPI响应Schema中使用Arrow类型并输出标准时间格式
解决方案
之所以之前开启arbitrary_types_allowed后返回嵌套对象,是因为该配置仅绕过了Pydantic的类型校验,没有指定Arrow类型的序列化规则,FastAPI会默认将Arrow对象转为字典结构返回。可通过以下两种方案解决:
方案1:单Schema配置序列化规则(最简适配)
仅需修改响应Schema的Config配置,无需调整其他逻辑,适合仅少数场景用到Arrow类型的情况:
class ProductResponse(BaseModel): id: int name: str created_at: Arrow class Config: orm_mode = True arbitrary_types_allowed = True # 新增Arrow类型的序列化规则 json_encoders = { Arrow: lambda v: v.isoformat() }
注意:无需再添加全局的
BaseConfig.arbitrary_types_allowed = True配置。
方案2:自定义全局复用的Pydantic Arrow类型(推荐)
如果项目多处用到Arrow类型,可自定义兼容Pydantic的字段类型,一次定义多处使用,还能自动适配OpenAPI文档的类型展示:
第一步:定义自定义Arrow类型
from arrow import Arrow as ArrowBase class PydanticArrow(ArrowBase): @classmethod def __get_validators__(cls): yield cls.validate @classmethod def validate(cls, v): if isinstance(v, ArrowBase): return v return ArrowBase(v) @classmethod def __modify_schema__(cls, field_schema): # 配置OpenAPI文档显示为日期时间字符串类型 field_schema.update(type="string", format="date-time") def __json__(self, *args): return self.isoformat()
第二步:替换响应Schema的字段类型
class ProductResponse(BaseModel): id: int name: str created_at: PydanticArrow # 替换为自定义类型 class Config: orm_mode = True
注意:该方案不需要配置
arbitrary_types_allowed和json_encoders,所有逻辑已封装在自定义类型中。
两种方案最终都会返回符合预期的ISO格式时间字符串,例如:2024-05-20T14:30:00+00:00。
内容的提问来源于stack exchange,提问作者Karol Zlot
相关产品推荐
相关产品推荐

