# デコレータを使うためにはvalidator、エラー検証のためにはValidationErrorをインポートする必要があります
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): # validatorはクラスメソッド。第2引数は好きな名前でOK
if " " not in v:
raise ValueError("must contain a space")
return v.title() # 先頭文字を大文字にしている
@validator("password2")
def passwords_match(
cls, v, values, **kwargs
): # values, **kwargsは validatorのサブセットです。
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.isalnum(), "must be alphanumeric"
return v
user = UserModel(
name="samuel colvin",
username="scolvin",
password1="zxcvbn",
password2="zxcvbn",
)
print(user)
try:
# Validation Errorの確認
UserModel(
name="samuel", # 名前に空白が含まれていない
username="scolvin!", # アルファベット以外が含まれている
password1="zxcvbn",
password2="zxcvbn2", # password1とpassword2が一致しない
)
except ValidationError as e:
print(e)
上記を実行すると、結果は下記のようになります。
python validator.py
name='Samuel Colvin' username='scolvin' password1='zxcvbn' password2='zxcvbn'
3 validation errors for UserModel
name
must contain a space (type=value_error)
username
must be alphanumeric (type=assertion_error)
password2
passwords do not match (type=value_error)
$ python multi_validator.py
first_name='Jane' last_name='Doe' nick_name='joe'
3 validation errors for NameModel
first_name
must be alphanumeric (type=assertion_error)
last_name
must be alphanumeric (type=assertion_error)
nick_name
must be alphanumeric (type=assertion_error)
from pydantic import BaseModel, validator, ValidationError
from typing import List
class ParentModel(BaseModel):
names: List[str]
# こちらは正常に動かない
class ChildModel1(ParentModel):
@validator("names", each_item=True)
def check_names_not_empty(cls, v):
assert v != "", "Empty strings are not allowed."
return v
# こちらは正常に動く
class ChildModel2(ParentModel):
@validator("names")
def check_names_not_empty(cls, v):
for name in v:
assert name != "", "Empty strings are not allowed."
return v
try:
child1 = ChildModel1(names=["a", "b", "", "c"])
except ValidationError as e:
print(e)
try:
child2 = ChildModel2(names=["a", "b", "", "c"])
except ValidationError as e:
print(e)