能否无需创建新BaseModel,用Pydantic反序列化Union类型?
如何直接反序列化带鉴别器的Union类型(无需额外BaseModel)
我想要将数据反序列化为如下定义的Union类型:
from pydantic import BaseModel, Field from typing import Annotated, Union, Literal class Foo(BaseModel): type: Literal["foo"] = "foo" x: int class Bar(BaseModel): type: Literal["bar"] = "bar" x: float Baz = Annotated[Union[Foo, Bar], Field(discriminator="type")] d = { "type": "bar", "x": 10.1 } # Deserialize Baz here
目前我可以通过创建另一个BaseModel来实现反序列化,代码如下:
class Config(BaseModel): baz: Baz model = Config.model_validate({"baz": d}) print(model) # Outputs: baz=Bar(type='bar', x=10.1)
但我想了解是否可以直接使用Pydantic内置函数,无需创建额外BaseModel来完成该操作?
当然可以,Pydantic v2提供了TypeAdapter工具,能够直接处理这类带鉴别器的Union类型的反序列化,不需要额外定义封装用的BaseModel。
直接实现的代码示例:
from pydantic import TypeAdapter from pydantic import BaseModel, Field from typing import Annotated, Union, Literal class Foo(BaseModel): type: Literal["foo"] = "foo" x: int class Bar(BaseModel): type: Literal["bar"] = "bar" x: float Baz = Annotated[Union[Foo, Bar], Field(discriminator="type")] d = { "type": "bar", "x": 10.1 } # 直接反序列化Baz类型 adapter = TypeAdapter(Baz) result = adapter.validate_python(d) print(result) # 输出: type='bar' x=10.1
TypeAdapter是Pydantic v2新增的核心工具,专门用于针对单个类型执行验证、序列化和反序列化操作,完全可以替代需要额外封装BaseModel的方案,同时保留鉴别器的自动匹配逻辑。
内容的提问来源于stack exchange,提问作者Tom McLean
相关产品推荐
相关产品推荐

