You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:10:16