title: pydantic驗證器Validator
date: 2020-01-17T01:20:38.127Z
tags: python,pydantic
categories: python
最近學習Python的fastapi框架,發現使用了pydantic來做輸入參數。看了一下pydantic的文檔,發現也可以用來做驗證器。
一開始用的挺好,后來碰到一個多字段聯合驗證的情況,在文檔里翻了一下,發現可以這么用,
from pydantic import BaseModel, ValidationError, validator
class UserModel(BaseModel):
name: str
username: str
password1: str
password2: str
@validator('name')
def name_must_contain_space(cls, v):
if ' ' not in v:
raise ValueError('must contain a space')
return v.title()
#聯合驗證
@validator('password2')
def passwords_match(cls, v, values, **kwargs):
if 'password1' in values and v != values['password1']:
raise ValueError('passwords do not match')
return v
@validator('username')
def username_alphanumeric(cls, v):
assert v.isalpha(), 'must be alphanumeric'
return v
print(UserModel(name='samuel colvin', username='scolvin', password1='zxcvbn',
password2='zxcvbn'))
#> name='Samuel Colvin' username='scolvin' password1='zxcvbn' password2='zxcvbn'
try:
UserModel(name='samuel', username='scolvin', password1='zxcvbn',
password2='zxcvbn2')
except ValidationError as e:
print(e)
"""
2 validation errors for UserModel
name
must contain a space (type=value_error)
password2
passwords do not match (type=value_error)
"""
於是動手試了一下,結果卻失敗了。經過一番調試,發現,這個values,並不是所有的輸入參數,只有驗證通過的才有,並且不包括當前的參數,當前參數從v取。
