- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想排除所有在创建 JSON 时未设置的 Optional 值。在这个例子中:
from pydantic import BaseModel
from typing import Optional
class Foo(BaseModel):
x: int
y: int = 42
z: Optional[int]
print(Foo(x=3).json())
我收到
{"x": 3, "y": 42, "z": null}
.但我想排除
z
.不是因为它的值是
None
, 但因为它是 Optional 并且没有
z
的关键字参数.在下面的两种情况下,我想要
z
在 JSON 中。
Foo(x=1, z=None)
Foo(x=1, z=77)
如果有任何其他解决方案可以设置
z
从这个意义上讲,我希望看到它。
最佳答案
您可以仅排除未设置的可选模型字段,方法是建立 的模型字段的并集。已设置 和那些不是无 .
Pydantic 为导出方法提供以下参数 model.dict(...) :
exclude_unset
: whether fields which were not explicitly set when creating the model should be excluded from the returned dictionary; defaultFalse
.
exclude_none
: whether fields which are equal toNone
should be excluded from the returned dictionary; defaultFalse
a = {**b, **c}
(来自
c
的值覆盖来自
b
的值)。请注意,从 Python 3.9 开始,它可以像
a = b | c
一样完成。 .
from pydantic import BaseModel
from typing import Optional
from pydantic.json import pydantic_encoder
import json
class Foo(BaseModel):
x: int
y: int = 42
z: Optional[int]
def exclude_optional_dict(model: BaseModel):
return {**model.dict(exclude_unset=True), **model.dict(exclude_none=True)}
def exclude_optional_json(model: BaseModel):
return json.dumps(exclude_optional_dict(model), default=pydantic_encoder)
print(exclude_optional_json(Foo(x=3))) # {"x": 3, "y": 42}
print(exclude_optional_json(Foo(x=3, z=None))) # {"x": 3, "z": null, "y": 42}
print(exclude_optional_json(Foo(x=3, z=77))) # {"x": 3, "z": 77, "y": 42}
更新
def union(source, destination):
for key, value in source.items():
if isinstance(value, dict):
node = destination.setdefault(key, {})
union(value, node)
else:
destination[key] = value
return destination
def exclude_optional_dict(model: BaseModel):
return union(model.dict(exclude_unset=True), model.dict(exclude_none=True))
class Foo(BaseModel):
x: int
y: int = 42
z: Optional[int]
class Bar(BaseModel):
a: int
b: int = 52
c: Optional[int]
d: Foo
print(exclude_optional_json(Bar(a=4, d=Foo(x=3))))
print(exclude_optional_json(Bar(a=4, c=None, d=Foo(x=3, z=None))))
print(exclude_optional_json(Bar(a=4, c=78, d=Foo(x=3, z=77))))
{"a": 4, "b": 52, "d": {"x": 3, "y": 42}}
{"a": 4, "b": 52, "d": {"x": 3, "y": 42, "z": null}, "c": null}
{"a": 4, "b": 52, "c": 78, "d": {"x": 3, "y": 42, "z": 77}}
关于python - 在从 pydantic.BaseModel 创建的 JSON 中,如果未设置,则排除可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65362524/
我正在使用 Pydantic 为对象建模。如何使两个字段互斥? 例如,如果我有以下模型: class MyModel(pydantic.BaseModel): a: typing.Option
我正在使用 Pydantic 为对象建模。如何使两个字段互斥? 例如,如果我有以下模型: class MyModel(pydantic.BaseModel): a: typing.Option
在前面随笔《基于SqlAlchemy+Pydantic+FastApi的Python开发框架 》中介绍了框架总体的内容,其中主要的理念就是通过抽象接口的方式,实现代码的重用,提高开发效率。本
随着大环境的跨平台需求越来越多,对与开发环境和实际运行环境都有跨平台的需求,Python开发和部署上都是跨平台的,本篇随笔介绍基于SqlAlchemy+Pydantic+FastApi的Python开
下面代码来自官方FastAPI tutorials page ,我无法理解这些语句(例如,name: str)。 from typing import Optional from fastapi im
我在 Pydantic 中有一个嵌套模型。我在外部模型中有一个 root_validator 函数。我的印象是,如果调用外部根验证器,则内部模型有效。但显然不是。在下面的 MWE 中,我为内部模型提供
目前,我正在尝试为 Pandas 数据框创建一个 pydantic 模型。我想通过以下检查列是否唯一 import pandas as pd from typing import List from
我想将日期的 json 输入验证为 pydantic 类,接下来,简单地将文件注入(inject) Mongo。 带有日期类型的简单类 class CustomerBase(BaseModel):
我有以下模型 class Window(BaseModel): size: tuple[int, int] 我想像这样实例化它: fields = {'size': '1920x1080'}
我的问题很简单,令我惊讶的是到目前为止还没有人问过它: 我如何在 pydantic 中验证日期? 例如,我只想接受 1980.1.1-2000.1.1 范围内的日期。 最佳答案 validator d
是否可以为不可变 Pydantic Models 传递函数 setter ? . 例如: from uuid import uuid4, UUID from pydantic import BaseM
我正在尝试删除名字和姓氏字段以及电子邮件字段上的空格。我无法让它工作。 from pydantic import BaseModel, UUID4, SecretStr, EmailStr, cons
来自 pydantic docs我明白这一点: import pydantic class User(pydantic.BaseModel): id: int name: str cl
我试图将类中的一个字段限制为枚举。但是,当我尝试从类中获取字典时,它不会转换为字符串。相反,它保留了枚举。我查了 pydantic documentation ,但找不到与我的问题相关的任何内容。 这
我想根据特定条件动态分配字段数据类型。以下是我的模型: class Connection(BaseModel): name: str # type can be GCS or ORAC
我尝试按如下方式使用 Pydantic: from pydantic import BaseModel class A(BaseModel): prop1: str prop2: str cl
我遵循定义的 pydantic 模型。当我运行 p = IntOrStr(value=True) 时,我预计会失败,因为 True 是 bool 值,它应该会导致对 __int 和 __str cla
我遵循定义的 pydantic 模型。当我运行 p = IntOrStr(value=True) 时,我预计会失败,因为 True 是 bool 值,它应该会导致对 __int 和 __str cla
当我想使用 attr 库忽略某些字段时,我可以使用 repr=False 选项。 但是我在 pydantic 中找不到类似的选项 请看示例代码 import typing import attr fr
Pydantic 在将模型传递给另一个模型的构造函数时复制模型。这失败了: from pydantic import BaseModel class Child(BaseModel): pas
我是一名优秀的程序员,十分优秀!