pydantic库


特性

  • 数据验证:可以定义数据模型并对数据进行验证。
  • 数据序列化:可以将数据序列化为JSON等格式。
  • 数据转换:可以将数据转换为特定类型。
  • 默认值和选项:可以设置字段的默认值和选项。
  • 异常处理:可以处理数据验证过程中的异常情况。

BaseModel类

  1. 用于定义数据模型,并且对数据进行验证:
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)
  1. 用于数据序列化,将数据序列化为JSON等格式:
print(user1.json())

# 得到结果:{"id": 1, "username": "Chanpoe", "email": "chanpoe@example.com"}

将用户对象序列化为JSON格式的数据,方便网络传输使用。


应用场景

  1. 数据验证

用来验证用户输入数据的合法性,保证数据符合预期格式和规则:

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)
  1. 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)

高级功能

  1. 自定义校验器:
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
  1. 继承、扩展模型
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)
  1. 自定义序列化器和反序列化器
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)

参考文章

pydantic,一个超强的 Python 库!


  目录