from enum import Enum, IntEnum
from datetime import datetime, date
from typing import List, Union
from typing import Optional
from pydantic import BaseModel, Field, ValidationError, validator
class UserModel(BaseModel):
user_id: int # 必传项, 可以为int 可以str类型int
username: str # 必传项, 可以为int 可以str类型int
gender: str # 必传值, 此处为自定义校验
active: bool = False # bool 类型 默认值 False
school = "吹灯大学" # 添加新字段修改值
address: str = Field(alias="addr") # 将传入addr输出为address
create_time: datetime
merge: Union[int, str] # 数据可以允许多种数据类型 zhangsan, 123 均可
age: Optional[int] # 非必传参数, 默认值为None
tag: List[int] = [] # 传入数组类型
@validator("gender")
def check_gender(cls, v):
if v not in ["male", "female"]:
raise ValueError("sex is wrong!!!")
return v
data = {
"user_id": 12345,
"username": 1456789,
"age": 18,
"gender": "male",
"addr": "北京潘家园",
'aa': False,
'tag': [1, '2', 3],
"create_time": "2022-09-12 03:04:05",
"merge": "123a"
}
try:
user = UserModel(**data)
print(user.dict())
print(user.json())
except ValidationError as e:
print(e)
{'user_id': 12345, 'username': '1456789', 'gender': 'male', 'active': False, 'address': '北京潘家园', 'create_time': datetime.datetime(2022, 9, 12, 3, 4, 5), 'merge': '123a', 'age': 18, 'tag': [1, 2, 3], 'school': '吹灯大学'}
{"user_id": 12345, "username": "1456789", "gender": "male", "active": false, "address": "u5317u4eacu6f58u5bb6u56ed", "create_time": "2022-09-12T03:04:05", "merge": "123a", "age": 18, "tag": [1, 2, 3], "school": "u5439u706fu5927u5b66"}
枚举类型校验
class GenderEnum(IntEnum):
male = 0
female = 1
class ShirtEnum(str, Enum):
S = "Small"
M = "Medium"
L = "Large"
class ConfigModel(BaseModel):
user_id: int
username: str
gender: GenderEnum
shirt: ShirtEnum = ShirtEnum.S # 设置默认
data = {
"user_id": 12345,
"username": 1456789,
"book": 2,
"shirt": "Small"
"test": "zhangsan"
}
user = ConfigModel(**data)
print(user.dict())
print(user.gender.value) # 输出值 0
print(user.shirt.value) # 输出值 Small
{'user_id': 12345, 'username': '1456789', 'gender': , 'shirt': }
- 高级复杂检查
class SchoolModel(BaseModel):
sch_id: int = 100
school: str
class UserModel(BaseModel):
user_id: int # 必传项, 可以为int 可以str类型int
username: str # 必传项, 可以为int 可以str类型int
age: int = 18 # 默认值 18
gender: GenderEnum
class UserListModel(BaseModel):
tag: List[int] = []
school: SchoolModel
users: List[UserModel]
data = {
"tag": [1, 3, '5', 7],
"school": {"sch_id": 12345, "school": "上海中学"},
"users": [
{"user_id": 12345, "username": "zhangsan", "gender": 1, "book": 2},
{"user_id": 12354, "username": "lisi", "gender": 1, "book": 2},
{"user_id": 12543, "username": "wanger", "gender":1, "book": 2},
]
}
user = UserListModel(**data)
print(user.dict())
print(user.school.sch_id) # 输出值 上海中学
print(user.users)
{'tag': [1, 3, 5, 7], 'school': {'sch_id': 12345, 'school': '上海中学'}, 'users': [{'user_id': 12345, 'username': 'zhangsan', 'age': 18, 'gender': }, {'user_id': 12354, 'username': 'lisi', 'age': 18, 'gender': }, {'user_id': 12543, 'username': 'wanger', 'age': 18, 'gender': }]}
[UserModel(user_id=12345, username='zhangsan', age=18, gender=), UserModel(user_id=12354, username='lisi', age=18, gender=), UserModel(user_id=12543, username='wanger', age=18, gender=)]
其它可参考
https://blog.csdn.net/codename_cys/article/details/107675748



