我正在尝试为嵌套Pydantic模型创建一个自定义JSON编码。我将问题简化为以下示例:
from pydantic import BaseModel
class SubModel(BaseModel):
name: str
short_name: str
class TestModel(BaseModel):
sub_model: SubModel
class Config:
json_encoders = {SubModel: lambda s: s.short_name}
model = TestModel(sub_model=SubModel(name="Sub Model", short_name="SM"))
print(model)
print(model.json())
我期待最后一行输出:
{"sub_model": "SM"}
但相反,我得到的输出就好像我从未定义过自己的json_encoders
:
{"sub_model": {"name": "Sub Model", "short_name": "SM"}}
如何为另一个Pydantic模型正确定义JSON编码器?
您指定的json_encoder
没有任何问题。您只需要将models_as_dict=False
添加到json()
方法中,就可以覆盖默认的dict-like序列化:
print(model.json(models_as_dict=False))
请参阅https://pydantic-docs.helpmanual.io/usage/exporting_models/#serialising-自参考或用于参考的其他模型。
我遇到了同样的问题。对我有用的是在全局BaseConfig而不是类上设置JSON编码器
from pydantic import BaseConfig
BaseConfig.json_encoders = {
MyClass: lambda v: v.as_str(),
}
参考:https://github.com/pydantic/pydantic/issues/2277#issuecomment-764010272