簡體   English   中英

如何使用列表中的值作為 pydantic 驗證器?

[英]How to use values from list as pydantic validator?

我想創建 pydantic model 來驗證用戶表單。 我的 model 值之一應從名稱列表中進行驗證。 我使用枚舉成功創建了 model,如下所示:

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

您可以通過以下方式使用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

您可以通過其.__members__字典獲取有關枚舉的信息 - 在這里您可以簡單地迭代它的鍵:

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

# only need __members__ if you need more infos about it

print(Fruit.__members__)

# you do not need the __members__ if you just want the keys
print([name.lower() for name in Fruit])

Output:

# enums __members__ dictionary
{'APPLE': <Fruit.APPLE: 'apple'>, 
 'BANANA': <Fruit.BANANA: 'banana'>, 
 'MELON': <Fruit.MELON: 'melon'>} 

# lower keys
['apple', 'banana', 'melon']

我提出了一個優雅的解決方案。

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 你需要一個 Fruit object 的列表,它會為你做

檢查上面的代碼:

將上面的代碼放在文件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不在水果中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM