前言:
Pydantic 是一个 Python 库,用于数据解析和验证。它主要基于 Python 类型提示来实现数据的校验和设定限制条件。在 Pydantic 中,BaseModel 是一个核心基类,用于创建数据模型。
1 BaseModel的主要作用包括:
数据验证(Validation):
BaseModel 类提供了自动数据验证的功能。当你创建一个基于 BaseModel 的子类并且为其字段添加类型注解(type annotations),Pydantic 会在实例化对象时自动校验给定的数据是否符合预期类型和约束。
数据转换(Conversion):
Pydantic 会尝试将输入数据转换成声明的数据类型。例如,如果一个字段被声明为 int 类型,但输入数据是一个数字字符串,如 “123”,Pydantic 会尝试转换这个字符串为整型 123。
模型实例化:
BaseModel 中提供的构造器可以让你轻松地实例化模型,并为其填充数据。在实例化过程中,数据会自动经过验证和转换。
错误处理:
如果数据不符合预期,Pydantic 会抛出描述性的错误(通常是 ValidationError 异常),告诉你哪些数据是无效的以及具体原因。
字段别名:
BaseModel 允许你为模型的字段设定别名,这样在解析外部数据如 JSON 时,如果其字段名称与你的模型字段不一致,依然可以正确匹配和解析。
JSON序列化与反序列化:
BaseModel 提供了 .json() 和 .parse_raw() 两个方法用于模型对象的 JSON 序列化(将 Python 对象转换为 JSON 字符串)和反序列化(将 JSON 字符串或二进制数据解析成 Python 对象)。
示例(Schema)生成:
BaseModel 可以自动为你的模型生成 JSON Schema,这在构建 RESTful API 并使用 OpenAPI/Swagger 进行文档化时非常有用。
ORM 模式:
Pydantic 具有一个 ORM 模式,允许 BaseModel 与 ORMs(如 SQLAlchemy)配合使用,可直接从 ORM 对象创建 Pydantic 模型实例。
#!/usr/bin/env python
# coding=utf-8
"""
# @Time : 2024/4/8 6:25
# @Author : Summer
# @File : test.py
# @describe:
"""
from datetime import datetime
from typing import Optional, List
from pydantic import BaseModel
# 定义模型
class User(BaseModel):
id: int
name: str = "Jane Doe" # 提供默认值
signup_ts: Optional[datetime] = None
friends: List[int] = []
# 实例化模型,自动进行数据验证
user = User(id=123, signup_ts="2021-01-01 12:22", friends=[1, 2, 3])
# 这里friends为int类型的时候运行会报如下错误
'''
pydantic_core._pydantic_core.ValidationError: 1 validation error for User
friends
Input should be a valid list [type=list_type, input_value=1, input_type=int]
'''
# user = User(id=123, signup_ts="2021-01-01 12:22", friends=1)
# 你也可以序列化模型
user_json = user.json()
# 或对初始 JSON 数据进行解析创建模型
original_data = '{"id": "123", "signup_ts": "2021-01-01 12:22", "friends": [1, 2, 3]}'
user = User.parse_raw(original_data)
2 Field
在 Pydantic 中,Field 函数用于提供更多的配置和校验选项给 BaseModel 的字段。通过使用 F