特性
- 数据验证:可以定义数据模型并对数据进行验证。
- 数据序列化:可以将数据序列化为JSON等格式。
- 数据转换:可以将数据转换为特定类型。
- 默认值和选项:可以设置字段的默认值和选项。
- 异常处理:可以处理数据验证过程中的异常情况。
BaseModel类
- 用于定义数据模型,并且对数据进行验证:
from pydantic import BaseModel
class User(BaseModel):
id: int
username: str
email: str
user1_dict = {
'id': 1,
'username': 'Chanpoe',
'email': 'chanpoe@example.com'
}
user1 = User(**user1_dict)
print(user1)
- 用于数据序列化,将数据序列化为JSON等格式:
print(user1.json())
# 得到结果:{"id": 1, "username": "Chanpoe", "email": "chanpoe@example.com"}
将用户对象序列化为JSON格式的数据,方便网络传输使用。
应用场景
- 数据验证
用来验证用户输入数据的合法性,保证数据符合预期格式和规则:
from pydantic import BaseModel, EmailStr, validator
# 自定义校验器(见下文高级功能介绍)
class UserRegistration(BaseModel):
username: str
email: EmailStr
password: str
# 验证用户密码不能小于8位,并且要同时有数字和字母
@validator('password')
def validate_password(cls, value):
if len(value) < 8:
raise ValueError('密码不能小于8位')
if not any(char.isdigit() for char in value):
raise ValueError('密码必须包含数字')
if not any(char.isalpha() for char in value):
raise ValueError('密码必须包含字母')
return value
# 处理用户注册请求
def register_user(user_data: dict):
print(user_data)
user = UserRegistration(**user_data)
print(user)
# 处理注册逻辑
return "User registered successfully"
# 示例请求数据
request_data = {"username": "john_doe", "email": "john.doe@example.com", "password": 'chanpoezhang123'}
result = register_user(request_data)
print(result)
- API参数处理
from fastapi import FastAPI
from pydantic import BaseModel, constr
app = FastAPI()
class UserSearch(BaseModel):
keyword: constr(min_length=3)
@app.post("/search")
def search_users(search_data: UserSearch):
keyword = search_data.keyword
# 处理搜索逻辑
return f"Searching users with keyword: {keyword}"
# 示例请求数据
request_data = {"keyword": "john"}
result = search_users(request_data)
print(result)
高级功能
- 自定义校验器:
class UserRegistration(BaseModel):
username: str
email: EmailStr
password: str
# 验证用户密码不能小于8位,并且要同时有数字和字母
@validator('password')
def validate_password(cls, value):
if len(value) < 8:
raise ValueError('密码不能小于8位')
if not any(char.isdigit() for char in value):
raise ValueError('密码必须包含数字')
if not any(char.isalpha() for char in value):
raise ValueError('密码必须包含字母')
return value
- 继承、扩展模型
from pydantic import BaseModel
class User(BaseModel):
username: str
email: str
class AdminUser(User):
role: str = "admin"
# 创建管理员用户对象并进行数据验证
admin_data = {"username": "admin_user", "email": "admin@example.com", "role": "admin"}
admin_user = AdminUser(**admin_data)
print(admin_user)
- 自定义序列化器和反序列化器
from pydantic import BaseModel, root_validator
class User(BaseModel):
username: str
email: str
@root_validator
def to_xml(cls, values):
xml_str = f"<user><username>{values['username']}</username><email>{values['email']}</email></user>"
return {"xml_data": xml_str}
# 创建用户对象并进行数据转换
user_data = {"username": "john_doe", "email": "john.doe@example.com"}
user = User(**user_data)
print(user.xml_data)