Pydantic使用别名定义_schema字段后实例化丢失该属性问题求助
Pydantic字段
schema冲突及序列化丢失问题解决 问题原因
下划线开头的字段(比如_schema)会被Pydantic默认识别为私有属性,不会被纳入模型的字段管理体系:
- 实例化时传入
_schema只是给对象添加了一个普通私有属性,并非模型字段,不会被验证或序列化。 - 调用
dict()方法时,私有属性默认不会被包含在输出结果中。
正确解决方案
方案1:更换非私有字段名(推荐)
避免使用下划线开头的字段名,改用一个不冲突的名称,同时通过alias指定对外的别名schema:
from pydantic import StrictStr, Field from pydantic import BaseModel class CreateStreamPayload(BaseModel): name: StrictStr data_schema: dict[str, str] = Field(alias='schema') # 实例化支持两种方式:用字段名或别名 a = CreateStreamPayload(name="joe", data_schema={"name": "a name"}) # 或直接用别名 a = CreateStreamPayload(name="joe", schema={"name": "a name"}) # 默认输出字段名,若需要输出别名,添加by_alias=True print(a.dict()) # {'name': 'joe', 'data_schema': {'name': 'a name'}} print(a.dict(by_alias=True)) # {'name': 'joe', 'schema': {'name': 'a name'}}
方案2:强制让私有字段被模型识别
如果必须保留下划线开头的字段名,可通过模型配置将私有属性设为公开:
Pydantic v2版本
from pydantic import StrictStr, Field from pydantic import BaseModel class CreateStreamPayload(BaseModel): model_config = {'private_attrs_are_public': True} name: StrictStr _schema: dict[str, str] = Field(alias='schema') a = CreateStreamPayload(name="joe", _schema={"name": "a name"}) print(a.dict()) # {'name': 'joe', '_schema': {'name': 'a name'}} # 输出别名的话用by_alias=True print(a.dict(by_alias=True)) # {'name': 'joe', 'schema': {'name': 'a name'}}
Pydantic v1版本
from pydantic import StrictStr, Field from pydantic.main import BaseModel class CreateStreamPayload(BaseModel): class Config: underscore_attrs_are_public = True name: StrictStr _schema: dict[str, str] = Field(alias='schema') a = CreateStreamPayload(name="joe", _schema={"name": "a name"}) print(a.dict())
内容的提问来源于stack exchange,提问作者Eric31
相关产品推荐
相关产品推荐

