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):
# values:包含任何先前验证的字段的名称到值映射的字典
if 'password1' in values and v != values['password1']:
raise ValueError('passwords do not match')
return v
user = UserModel(
name='samuel colvin',
username='scolvin',
password1='zxcvbn',
password2='zxcvbn',
)
print(user)
# 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)
"""
from typing import List
from pydantic import BaseModel, ValidationError, validator
classDemoModel(BaseModel):
square_numbers: List[int]=[]
cube_numbers: List[int]=[]# 1.可以使用'*'来校验所有字段# 2.pre=True,可以在验证器前对数据进行预处理,此处如果不处理字符串,下面的验证器在对字段值求和时就会报错@validator('*', pre=True)defsplit_str(cls, v):ifisinstance(v,str):return v.split('|')return v
# 3.没有初始化的字段,验证器不会执行@validator('cube_numbers','square_numbers')defcheck_sum(cls, v):ifsum(v)>42:raise ValueError('sum of numbers greater than 42')return v
# 4.each_item=True可以实现对字段值的遍历@validator('square_numbers', each_item=True)defcheck_squares(cls, v):print(v)assert v >=1,f'{v} is not a square number'return v
print(DemoModel(square_numbers="1|2|3"))# print(DemoModel(square_numbers=[1, 4, 9]))
from typing import List
from pydantic import BaseModel, ValidationError, validator
classParentModel(BaseModel):
names: List[str]classChildModel(ParentModel):# 每个元素必须为空字符串@validator('names', each_item=True)defcheck_names_not_empty(cls, v):assert v !='','Empty strings are not allowed.'return v
# This will NOT raise a ValidationError because the validator was not calledtry:
child = ChildModel(names=['Alice','Bob','Eve',''])except ValidationError as e:print(e)else:print('No ValidationError caught.')# No ValidationError caught.
需要使用循环来处理
classChildModel2(ParentModel):@validator('names')defcheck_names_not_empty(cls, v):for name in v:assert name !='','Empty strings are not allowed.'return v
try:
child = ChildModel2(names=['Alice','Bob','Eve',''])except ValidationError as e:print(e)"""
1 validation error for ChildModel2
names
Empty strings are not allowed. (type=assertion_error)
"""
4.始终验证
验证器在校验字段没有初始化的前提下是不会进行校验的
使用always=True来实现,在没有初始化的前提下,给提供一个动态的默认值
通常情况下与pre=True一起使用
from datetime import datetime
from pydantic import BaseModel, validator
classDemoModel(BaseModel):
ts: datetime =None@validator('ts', pre=True, always=True)defset_ts_now(cls, v):return v or datetime.now()print(DemoModel())# ts=datetime.datetime(2022, 6, 15, 18, 25, 41, 389042)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?