如何使用列表中的值作为pydantic验证器?

2024-05-29 10:32:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建pydantic模型来验证用户表单。 应该从名称列表中验证我的一个模型值。 我成功地使用enum创建了模型,如下所示:

from enum import Enum
class Fruit(str, Enum):
    APPLE = 'apple'
    BANANA = 'banana'
    MELON = 'melon'

from pydantic import BaseModel
class UserForm(BaseModel):
    fruit: Fruit
    name: str

现在,我想将枚举切换到代码中的值列表:

fruit = ['apple','banana','melon']

我怎样才能做到这一点

tnx


Tags: from模型importapple列表enumclassbasemodel
3条回答

您可以通过以下方式使用validator

 from pydantic import BaseModel, ValidationError, validator
 class UserForm(BaseModel):
    fruit: str
    name: str
    @validator('fruit')
    def fruit_must_be_in_fruits(cls,fruit):
      fruits=['apple','banana','melon']
      if fruit not in fruits:
        raise ValueError(f'must be in {fruits}')
      return fruit
 try:
    UserForm(fruit="apple",name="apple")
 except ValidationError as e:
    print(e)

如果不符合条件,则会引发验证错误

您也可以通过Literal类型的列表来实现这一点。像这样:

import pydantic
from typing import Literal, List

class M(pydantic.BaseModel):
    fruits: List[Literal["apple", "orange"]]

print(M.parse_obj({"fruits":["apple", "orange"]}))  # OK fruits=['apple', 'orange']
print(M.parse_obj({"fruits":["apple", "orange", "potato"]}))  # Error unexpected value potato

我提出了一个优雅的解决方案

from pydantic import BaseModel
from typing import List
from enum import Enum


class Fruit(str, Enum):
    APPLE = 'apple'
    BANANA = 'banana'
    MELON = 'melon'


class UserForm(BaseModel):
    fruits: List[Fruit]
    name: str

就这样

  • 您不需要编写自己的验证器
  • 只要告诉pydantic您需要一个水果对象列表,它就会帮您完成

检查上述代码:

将上述代码放入文件main.py

python -i main.py
>>> uf = UserForm(fruits=['apple','banana'],name='hello')
>>> uf
UserForm(fruits=[<Fruit.APPLE: 'apple'>, <Fruit.BANANA: 'banana'>], name='hello')


>>> af = UserForm(fruits=['monkey','apple'],name='hello')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pydantic/main.py", line 400, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for UserForm
fruits -> 0
  value is not a valid enumeration member; permitted: 'apple', 'banana', 'melon' (type=type_error.enum; enum_values=[<Fruit.APPLE: 'apple'>, <Fruit.BANANA: 'banana'>, <Fruit.MELON: 'melon'>])
>>> 

pydantic将引发一个错误,因为monkey不在结果中

相关问题 更多 >

    热门问题