當前位置: 華文世界 > 科技

使用 Pydantic 基本模型 (BaseModel) 的詳細指南

2024-07-23科技

前言

Pydantic 是一個用於數據驗證和設定管理的 Python 庫。它透過使用 Python 型別註解(type hints),提供了簡單而高效的數據驗證機制。Pydantic 的核心元件是 BaseModel 類,透過繼承這個類,我們可以定義具有數據驗證和序列化功能的模型。

定義基本模型

Pydantic 使用 BaseModel 類作為所有模型的基礎類別。透過繼承 BaseModel,我們可以定義一個數據模型。以下是一個簡單的範例:

pythonfrom pydantic import BaseModel class User(BaseModel): id: int name: str age: int email: str

在這個例子中,我們定義了一個 User 模型,包含 id 、name 、age 和 email 四個欄位,每個欄位都有明確的型別註解。

建立模型例項

我們可以透過傳遞字典或關鍵字參數來建立模型例項。Pydantic 會自動驗證傳入的數據,並在必要時進行型別轉換。

pythonuser = User(id=1, name='Alice', age=30, email='[email protected]')print(user)

如果傳入的數據不符合定義的型別,Pydantic 會丟擲驗證錯誤。例如,以下程式碼會引發一個驗證錯誤,因為 age 應該是一個整數:

pythontry: user = User(id=1, name='Alice', age='thirty', email='[email protected]')except ValueError as e: print(e)

數據驗證與錯誤處理

Pydantic 提供了詳細的錯誤資訊,幫助我們快速定位問題。我們可以透過捕獲 ValidationError 異常來處理這些錯誤。

pythonfrom pydantic import ValidationErrordata = {'id': 1, 'name': 'Alice', 'age': 'thirty', 'email': '[email protected]'}try: user = User(**data)except ValidationError as e: print(e.json())

上述程式碼會輸出驗證錯誤的詳細資訊,包括哪個欄位驗證失敗以及失敗的原因。

預設值與可選欄位

在定義模型時,我們可以為欄位設定預設值,或將欄位設為可選。使用 Optional 型別註解可以定義可選欄位。

pythonfrom typing import Optional class User(BaseModel): id: int name: str age: Optional[int] = None email: str = '[email protected]'

在這個例子中, age 欄位是可選的,預設值為 None ,而 email 欄位有一個預設值 '[email protected]' 。

巢狀模型

Pydantic 允許我們在一個模型中巢狀另一個模型,這對於復雜的數據結構非常有用。

python class Address(BaseModel): street: str city: str zip_code: str class User(BaseModel): id: int name: str age: int email: str address: Addressaddress_data = {'street': '123 Main St', 'city': 'New York', 'zip_code': '10001'}user_data = {'id': 1, 'name': 'Alice', 'age': 30, 'email': '[email protected]', 'address': address_data}user = User(**user_data)print(user)

在這個例子中,我們定義了一個 Address 模型,並在 User 模型中巢狀了 Address 模型。

數據序列化與反序列化

Pydantic 提供了方便的方法來序列化和反序列化模型例項。例如,我們可以將模型例項轉換為字典或 JSON 格式:

pythonuser_dict = user.dict()user_json = user.json()print(user_dict)print(user_json)

我們還可以透過解析 JSON 數據來建立模型例項:

pythonjson_data = '{"id": 1, "name": "Alice", "age": 30, "email": "[email protected]", "address": {"street": "123 Main St", "city": "New York", "zip_code": "10001"}}'user = User.parse_raw(json_data)print(user)

總結

Pydantic 的 BaseModel 提供了強大的數據驗證和序列化功能,使得數據處理更加安全和高效。透過定義清晰的型別註解和模型,我們可以輕松地管理和驗證復雜的數據結構。