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()

淺拷貝模型對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM