首页 > 解决方案 > 如何在 Pydantic (FastAPI) 中切换布尔值

问题描述

编辑:在@juanpa.arrivillaga 正确辩称最初的问题没有提供最小的可复制示例之后,我决定重写它添加更多上下文:我正在使用FastAPI。

我试图通过定义一个将返回项目值的验证器来not调整项目值:

from pydantic import BaseModel, Field, validator


class Foo(BaseModel):
    key: str = Field(...)
    condition: bool = Field(...)

    @validator('condition')
    def toogleCondition(cls, v):
        return not v

这个工具有效

但是,当在 FastAPI 中使用模型时(显然)它不起作用。

from fastapi import FastAPI
from pydantic import BaseModel, Field, validator


# insert Foo definition here

app = FastAPI()


@app.get("/fail", response_model=Foo)
def fail():
    return Foo(key='hola', condition=True)


@app.get("/success")
def success():
    return Foo(key='hola', condition=True).dict()

如果您运行该代码,您将获得/fail两次的转换值,而/success只转换一次。

这是因为response_model再次运行验证,这再次对其进行了调整。

标签: pythonpython-3.xfastapipydantic

解决方案


这通常有效:

>>> import pydantic, typing
>>> data = [{'key': 'foo', 'condition': False}, {'key': 'bar', 'condition': True}]
>>> class Foo(pydantic.BaseModel):
...     key: str
...     condition: bool
...     @pydantic.validator("condition")
...     def toggle_condition(cls, v):
...         return not v
...
>>> class Bar(pydantic.BaseModel):
...     foo_list: typing.List[Foo]
...
>>> Bar(foo_list=data)
Bar(foo_list=[Foo(key='foo', condition=True), Foo(key='bar', condition=False)])
>>> data
[{'key': 'foo', 'condition': False}, {'key': 'bar', 'condition': True}]

这是我正在使用的:

>>> pydantic.version.VERSION
'1.7.3'
>>> import sys
>>> print(sys.version)
3.7.7 (default, May  6 2020, 04:59:01)
[Clang 4.0.1 (tags/RELEASE_401/final)]

推荐阅读