我正在使用 Padantic v2 创建模型,然后将 model_json_schema 提供给其他需要确保提供所有必需参数的团队。
有没有办法获取 model_json_schema 中的validation_alias而不是字段名称?
例如,这是我的模型:
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import Field, AliasPath
class Config(BaseSettings):
model_config = SettingsConfigDict(validation_alias=lambda field_name: field_name.lower())
a: int = Field(..., validation_alias=AliasPath("b", "c"))
schema = Config.model_json_schema()
当前架构:
{
"additionalProperties": false,
"properties": {
"a": {
"title": "A",
"type": "integer"
}
},
"required": [
"a"
],
"title": "Config",
"type": "object"
}
“a”在我初始化模型的源中不存在, 例如,这是来源:{“b”:{“c”:3}} 另一方面,我想像这样访问“a”:
model.a
而不是
model.b.c
这是所需的架构:
{
"$defs": {
"ConfigB": {
"additionalProperties": false,
"properties": {
"c": {
"title": "C",
"type": "integer"
}
},
"required": [
"c"
],
"title": "ConfigB",
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"b": {
"$ref": "#/$defs/ConfigB"
}
},
"required": [
"b"
],
"title": "Config",
"type": "object"
}
提前致谢
我使用@compulated_field而不是使用validation_alias=AliasPath(...),如下所示:
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import Field, AliasPath
class BModel(BaseSettings):
c: int
class Config(BaseSettings):
model_config = SettingsConfigDict(validation_alias=lambda field_name: field_name.lower())
b: BModel
@computed_field
@property
def a(self) -> int:
return self.b.c
schema = Config.model_json_schema()
schema
{
"$defs": {
"BModel": {
"additionalProperties": false,
"properties": {
"c": {
"title": "C",
"type": "integer"
}
},
"required": [
"c"
],
"title": "BModel",
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"b": {
"$ref": "#/$defs/BModel"
}
},
"required": [
"b"
],
"title": "Config",
"type": "object"
}