如何将嵌套的Pydantic模型序列化为单个值?
实现Pydantic嵌套Id模型序列化为单一值
方法一:在Id模型中添加自定义序列化逻辑
直接给Id类添加@model_serializer装饰器,定义序列化时返回value字段的值:
from pydantic import BaseModel, model_serializer from typing import Optional class Id(BaseModel): value: Optional[str] @model_serializer def serialize_id(self): return self.value class Item(BaseModel): id: Id name: str
测试验证:
item = Item(id=Id(value="my id here"), name="my name") print(item.model_dump()) # 输出: {'id': 'my id here', 'name': 'my name'} print(item.model_dump_json()) # 输出: {"id":"my id here","name":"my name"}
方法二:在Item模型的id字段上指定序列化器
如果不想修改Id类的定义,可以使用Annotated结合PlainSerializer,在Item的id字段上单独配置序列化规则:
from pydantic import BaseModel, PlainSerializer from typing import Optional, Annotated class Id(BaseModel): value: Optional[str] class Item(BaseModel): id: Annotated[Id, PlainSerializer(lambda x: x.value)] name: str
运行上述测试代码,同样会得到预期的序列化结果。
注意事项
- 当
Id的value为None时,序列化结果中id的值也会是None,符合Optional[str]的类型定义。 - 两种方法都保留了原有的模型结构,不会影响模型的校验和日常使用逻辑。
内容的提问来源于stack exchange,提问作者Avihai Shalom
相关产品推荐
相关产品推荐

