- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用例,我想在构建模型时在我的类中创建一些值。但是,当我在调用 API 时将该类返回到 FastAPI 以转换为 JSON 时,构造函数将再次运行,并且我可以获得与原始实例不同的值。
这是一个人为的例子来说明:
class SomeModel(BaseModel):
public_value: str
secret_value: Optional[str]
def __init__(self, **data):
super().__init__(**data)
# this could also be done with default_factory
self.secret_value = randint(1, 5)
def some_function() -> SomeModel:
something = SomeModel(public_value="hello")
print(something)
return something
@app.get("/test", response_model=SomeModel)
async def exec_test():
something = some_function()
print(something)
return something
控制台输出是:
public_value='hello' secret_value=1
public_value='hello' secret_value=1
但是 Web API 中的 JSON 是:
{
"public_value": "hello",
"secret_value": 2
}
当我逐步执行代码时,我可以看到
__init__
被调用两次。
something = SomeModel(public_value="hello")
.
exec_test
在
return something
称呼。
最佳答案
由于您使用的是 response_model
对于路径操作,您的返回值将根据它进行验证。但是由于您返回的是一个已经验证过的模型实例,这会发生两次。如果您不使用变异 __init__
就不会引起注意无论输入值如何,该方法都可以为模型的每个实例化生成不同的值。
我认为最可取的解决方案是使用 default_factory
函数,因为在这种情况下动态值只会在你的代码中实例化对象的时候生成,而现成的值会在模型验证过程中返回时使用。
class SomeModel(BaseModel):
public_value: str
secret_value: int = Field(default_factory=lambda: randint(1, 5))
如果由于某种原因您不想使用上述方法,那么您可以使用
always validator ,这将允许您检查该值是否已传递或是否需要创建:
class SomeModel(BaseModel):
public_value: str
secret_value: int = None
@validator('secret_value', pre=True, always=True)
def secret_validator(cls, v):
return randint(1, 5) if v is None else v
关于python - 为什么FastAPI从路由函数返回时会执行两次Pydantic构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69090377/
我正在使用 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
我是一名优秀的程序员,十分优秀!