【问题标题】:FASTAPI & Pydantic: How to specify possible values for a field in pydantic.BasemodelFASTAPI 和 Pydantic:如何为 pydantic.Basemodel 中的字段指定可能的值
【发布时间】:2021-08-20 16:03:21
【问题描述】:

我有一个像这样的模型:

# Imports
from pydantic import BaseModel

# Data Models
class MyModel(BaseModel):
    a: str
    b: str
    c: str

@app.post('/endpoint_to_post')
async def post_log(my_model: MyModel):

我想在这个模型上指定一些约束。 确实,我需要对模型 MyModel 的字段 C 进行可能值约束。

喜欢:

# Imports
from pydantic import BaseModel

# Data Models
class MyModel(BaseModel):
    a: str
    b: str
    c: str in ['possible_value_1', 'possible_value_2']

感谢您的帮助:)

【问题讨论】:

标签: fastapi pydantic


【解决方案1】:

您可以从Python stdlib 使用enum:

from enum import Enum
from pydantic import BaseModel


class CEnum(Enum):
    VALUE_1 = 'possible_value_1'
    VALUE_2 = 'possible_value_2'


# Data Models
class MyModel(BaseModel):
    a: str
    b: str
    c: CEnum

Pydantic 将自动将任何匹配枚举值的字符串转换为正确的枚举实例,如果它不匹配任何内容,则会引发ValidationError。您可以将其与 Python 的 typing 中的 Optional 或 Union 结合使用,以使该字段成为可选字段或也允许其他类型(传递给 Union 的所有类型中的第一个匹配类型将由 Pydantic 使用,因此您可以使用Union[CEnum, str] 创建一个“包罗万象”的场景。

【讨论】:

  • 感谢您的回答 :) 如果您想检查,我找到了另一个使用 pydantic.validator (和一个独特的模型)的解决方案
【解决方案2】:

我找到了解决办法,

我使用 pydantic.validator 来实现这一点。

例子:

# Imports
from pydantic import BaseModel, validator

# Data Models
class MyModel(BaseModel):
    a: str
    b: str
    c: str # in ['possible_value_1', 'possible_value_2']

    @validator('c')
    def c_match(cls, v):
        if not v in ['possible_value_1', 'possible_value_2']:
            raise ValueError('c must be in [possible_value_1, possible_value_2]')
        return v

cfhttps://pydantic-docs.helpmanual.io/usage/validators/

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 2021-04-15
    • 2023-02-23
    • 2021-01-01
    • 2021-04-04
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多