Python - pydantic(1) 入门介绍与 Models 的简单使用
前言
为啥要学这个,因为 FastAPI 是基于它进行开发的,而且是个不错的框架,所以有必要深入学习
前置学习
Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html
typing 模块:https://www.cnblogs.com/poloyy/p/15150315.html
Pydantic 介绍
- 使用 python 类型注释来进行数据校验和 settings 管理
- pydantic 可以在代码运行时强制执行类型提示,并在数据校验无效时提供友好的错误提示
- 定义数据应该如何在规范的 python 代码中保存,然后通过 Python 验证它
Pydantic 安装
pip install pydantic
测试 pydantic 是否已编译
import pydantic print('compiled:', pydantic.compiled) # 输出结果 compiled: True
Pydantic 注意事项
- pydantic 是一个解析库,而不是一个验证库
- 验证是达到目的一种手段,构建符合所提供的类型和约束的模型
- 简单来说:pydantic 保证输出模型的类型和约束,而不是输入数据
Models
简介
- 在 pydantic 中定义对象的主要方法是通过模型(模型是从 BaseModel 继承的类)
- 所有基于 pydantic 的数据类型本质上都是一个 BaseModel 类
- 可以将模型视为强类型语言中的类型(比如 Java)
- 不受信任的数据可以传递给模型,经过解析和验证后,pydantic 保证生成的模型实例的字段将符合定义的字段类型(实例字段类型符合类定义的字段类型)
基础模型使用
from pydantic import BaseModel class User(BaseModel): id: int name = "小菠萝测试笔记"
- User 就是一个模型(Models),有两个字段(属性)
- id,整数 int 类型,是必传的
- name,字符串 string 类型,不是必传,有默认值
为什么能知道 name 是 string 类型?
因为默认值是 string 类型,因此不需要类型提示( name : string )
注意:当某些字段没有类型提示时,需要注意有关字段顺序的警告
声明一个有效实例
user = User(id='123')
- user 是 User 模型的一个实例对象,就叫模型实例对象吧
- 对象的初始化会执行所有解析和验证,如果没有抛出 ValidationError,证明生成的模型实例是有效的
访问模型实例对象的属性
user = User(id='123') print(user.id, type(user.id)) print(user.name, type(user.name)) # 输出结果 123 <class 'int'> 小菠萝测试笔记 <class 'str'>
- id 属性传的是字符串 '123',它会根据模型字段类型进行转换为 int
- name 属性取了默认值
__fields_set__
该变量返回用户初始化对象时提供了什么字段
# __fields_set__ user = User(id='123') print(user.__fields_set__ == {'id'}) print(user.__fields_set__ == {'name'}) user = User(id='123', name="test") print(user.__fields_set__ == {'id', 'name'}) print(user.__fields_set__ == {'id'}) # 输出结果 True False True False
dict()
可以提供字段的字典对象
# dict() user = User(id='123') print(user.dict()) print(dict(user)) # 输出结果 {'id': 123, 'name': '小菠萝测试笔记'} {'id': 123, 'name': '小菠萝测试笔记'}
修改模型实例对象的属性
# 修改模型实例属性值 user = User(id='123') user.id = 321 print(user.id) # 输出结果 321
BaseModels 属性
其实就是 BaseModels 有什么自带的方法、属性
dict()
返回模型字段和值,字典格式
user = User(id='123', name="test") print(user.dict(), type(user.dict())) # 输出结果 {'id': 123, 'name': 'test'} <class 'dict'>
json()
返回模型字段和值,json 字符串格式
user = User(id='123', name="test") print(user.json(), type(user.json())) # 输出结果 {"id": 123, "name": "test"} <class 'str'>
schema()
以 JSON Schema 形式返回模型,字典格式
user = User(id='123', name="test") print(user.schema(), type(user.schema())) # 输出结果 { "title": "User", "type": "object", "properties": { "id": { "title": "Id", "type": "integer" }, "name": { "title": "Name", "default": "小菠萝测试笔记", "type": "string" } }, "required": [ "id" ] } <class 'dict'>
schema_json()
以 JSON Schema 形式返回模型,json 字符串格式
user = User(id='123', name="test") print(user.schema_json(), type(user.schema_json())) # 输出结果 { "title": "User", "type": "object", "properties": { "id": { "title": "Id", "type": "integer" }, "name": { "title": "Name", "default": "小菠萝测试笔记", "type": "string" } }, "required": [ "id" ] } <class 'str'>
copy()
浅拷贝模型对象