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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:45:02