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

FastAPI/Pydantic序列化ORM模型时字段别名配置失效问题求助

问题原因

你当前的写法错误在于:将模型的uuid字段别名设为id后,开启ORM模式的Pydantic会尝试从ORM对象中读取别名id对应的属性——也就是ORMModel里的id字段(类型为int),这和你定义的UUID类型不匹配,因此触发ValidationError。

解决方案

Pydantic v1 版本

使用Config.fields映射模型字段与ORM对象的属性,明确指定模型的id字段对应ORM对象的uuid属性:

from uuid import UUID
from fastapi import FastAPI
from pydantic import BaseModel
from dataclasses import dataclass


class ApiSchema(BaseModel):
    class Config:
        orm_mode = True
        # 映射规则:模型id字段 ← ORM对象uuid属性
        fields = {"id": {"alias": "uuid"}}

    id: UUID
    foo: str | None = None


@dataclass
class ORMModel:
    id: int
    uuid: UUID
    foo: str = 'bar'


app = FastAPI()

@app.get("/")
def endpoint() -> ApiSchema:
    t = ORMModel(id=1, uuid=UUID('12345678123456781234567812345678'), foo='bar')
    return t

Pydantic v2 版本

v2中orm_mode已更名为from_attributes,可以通过validation_alias指定从ORM对象读取的属性:

from uuid import UUID
from fastapi import FastAPI
from pydantic import BaseModel, Field
from dataclasses import dataclass


class ApiSchema(BaseModel):
    # 序列化输出为id,从ORM对象的uuid属性取值
    id: UUID = Field(validation_alias="uuid")
    foo: str | None = None

    model_config = {"from_attributes": True}


@dataclass
class ORMModel:
    id: int
    uuid: UUID
    foo: str = 'bar'


app = FastAPI()

@app.get("/")
def endpoint() -> ApiSchema:
    t = ORMModel(id=1, uuid=UUID('12345678123456781234567812345678'), foo='bar')
    return t

也可以用model_config的fields配置实现同样效果:

class ApiSchema(BaseModel):
    id: UUID
    foo: str | None = None

    model_config = {
        "from_attributes": True,
        "fields": {"id": {"validation_alias": "uuid"}}
    }
验证效果

启动服务后访问接口,将得到预期响应:

{
  "id": "12345678-1234-5678-1234-567812345678",
  "foo": "bar"
}

内容的提问来源于stack exchange,提问作者andy_lu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:01:29