如何在Pydantic的model_dump序列化中控制递归深度?
如何在Pydantic的model_dump序列化中控制递归深度?
我懂你要的效果——就是Data实例调用model_dump时,info字段保留原来的Info对象,而不是被默认的递归逻辑拆成字典对吧?这确实是用Pydantic时经常会碰到的需求,我给你几个实用的解决办法:
方法一:使用字段序列化器精准控制
在Data类里给info字段专门定义一个序列化器,让它直接返回实例本身,跳过默认的递归序列化流程。代码示例如下:
from pydantic import BaseModel, field_serializer class Info(BaseModel): data: str class Data(BaseModel): info: Info @field_serializer('info') def serialize_info(self, value: Info) -> Info: return value
当你运行Data(info=Info(data="some data")).model_dump()时,返回结果就会是{"info": Info(data="some data")},完全符合你的预期。
方法二:重写model_dump方法完全自定义输出
如果你想要更直接的控制,也可以直接重写Data类的model_dump方法,手动组装你需要的返回结构:
from pydantic import BaseModel class Info(BaseModel): data: str class Data(BaseModel): info: Info def model_dump(self, **kwargs): # 你可以根据需求决定是否处理传入的kwargs参数,比如忽略或部分应用 return {"info": self.info}
这种方式自由度极高,你可以完全按照自己的需求构造返回内容,适合需要高度定制序列化结果的场景。
额外提示
如果你使用的是Pydantic v1版本,对应的序列化方法是dict()而不是v2的model_dump(),序列化器的写法会有细微差别,但核心思路是一致的——要么指定字段的专属序列化逻辑,要么重写序列化方法来控制输出。
备注:内容来源于stack exchange,提问作者Fábio Costa
相关产品推荐
相关产品推荐

