前言
為啥要學這個,因為 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()
淺拷貝模型對象