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
相关产品推荐
相关产品推荐

