我有一个嵌套的json,我用PYDANIC进行了验证:

app_dict={'apps': [{'app_id': 'a_1',
   'group_id': '123',
   'report_id': '456',
   'principal_id': 'p_1'},
  {'app_id': 'a_2',
   'group_id': '789',
   'report_id': '987'}]}}


class PbiApps(BaseModel):
    app_id: ty.Required[pty.StrictStr]
    group_id: ty.Required[pty.StrictStr]
    report_id: ty.Required[pty.StrictStr]
    principal_id: ty.Optional[pty.StrictStr]
 
class PbiMain(BaseModel):
    apps: ty.Optional[ty.List[PbiApps]]

但如果我试图将其解析为PbiMain,它会抛出a_2的ValidationError

PbiRoot(**app_dict)


ValidationError: 1 validation error for Settings
apps.1.principal_id
  Field required [type=missing, input_value={'app_id': 'a_2', '...test', 'report_id': '789'}, input_type=DictConfig]
    For further information visit https://errors.pydantic.dev/2.5/v/missing

我可以设置principal_id: ty.Optional[pty.StrictStr] = None以使其工作,但我宁可让该文件不存在,也不希望类型为None.

有没有办法实现这一点?

推荐答案

将该字段标记为Optional[T]并不意味着该字段为optional-它只是允许该值的类型为TNone.如果要将某个字段设置为可选(非必填),请定义一个默认值.

from pydantic import BaseModel, StrictStr


class PbiApps(BaseModel):
    app_id: StrictStr
    group_id: StrictStr
    report_id: StrictStr
    principal_id: StrictStr | None = None

https://docs.pydantic.dev/latest/migration/#required-optional-and-nullable-fields


如果您需要以某种方式区分未设置和默认值,请考虑使用model_dump(exclude_unset=True):

from pydantic import BaseModel, StrictStr


app_dict = {
    "apps": [
        {
            "app_id": "a_1",
            "group_id": "123",
            "report_id": "456",
            "principal_id": "p_1",
        },
        {
            "app_id": "a_2",
            "group_id": "789",
            "report_id": "987",
        },
    ]
}


class PbiApps(BaseModel):
    app_id: StrictStr
    group_id: StrictStr
    report_id: StrictStr
    principal_id: StrictStr | None = None


class PbiMain(BaseModel):
    apps: list[PbiApps] | None


assert PbiMain(**app_dict).model_dump(exclude_unset=True) == app_dict

顺便说一下,为了避免混淆,请考虑使用T | None而不是Optional[T].见https://fastapi.tiangolo.com/python-types/#using-union-or-optional

Python相关问答推荐

如何在PIL、Python中对图像应用彩色面膜?

计算相同形状的两个张量的SSE损失

Odoo 14 hr. emergency.public内的二进制字段

如何比较numPy数组中的两个图像以获取它们不同的像素

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

如何标记Spacy中不包含特定符号的单词?

运行总计基于多列pandas的分组和总和

Python虚拟环境的轻量级使用

我如何使法国在 map 中完全透明的代码?

pyscript中的压痕问题

如何在Raspberry Pi上检测USB并使用Python访问它?

形状弃用警告与组合多边形和多边形如何解决

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

实现神经网络代码时的TypeError

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

如何在达到end_time时自动将状态字段从1更改为0

pandas:对多级列框架的列进行排序/重新排序

为什么常规操作不以其就地对应操作为基础?

在Python中使用yaml渲染(多行字符串)

PYTHON、VLC、RTSP.屏幕截图不起作用