以下是一個搭配 Pydantic 的示例,演示如何使用多型性進行 CRUD 操作,並且在資料模型中使用 Pydantic:
首先,我們定義使用 Pydantic 的資料模型:
from pydantic import BaseModel
from bson import ObjectId
from datetime import datetime
class User(BaseModel):
name: str
email: str
class Product(BaseModel):
name: str
price: float
class DatabaseHandler(ABC):
@abstractmethod
def create(self, data: BaseModel):
pass
@abstractmethod
def read(self, query: dict):
pass
@abstractmethod
def update(self, query: dict, data: BaseModel):
pass
@abstractmethod
def delete(self, query: dict):
pass
接下來,我們建立使用 Pydantic 的子類 UserHandler
和 ProductHandler
,並實現了特定於使用者和產品的 CRUD 操作,同時使用 Pydantic 的資料模型:
class UserHandler(DatabaseHandler):
def create(self, data: User):
# 將Pydantic模型轉換為字典
user_data = data.dict()
return self.db.users.insert_one(user_data)
def read(self, query: dict):
result = self.db.users.find(query)
# 將結果轉換為Pydantic模型
return [User(**item) for item in result]
def update(self, query: dict, data: User):
# 將Pydantic模型轉換為字典
user_data = data.dict()
return self.db.users.update_one(query, {"$set": user_data})
def delete(self, query: dict):
return self.db.users.delete_one(query)
class ProductHandler(DatabaseHandler):
def create(self, data: Product):
# 將Pydantic模型轉換為字典
product_data = data.dict()
return self.db.products.insert_one(product_data)
def read(self, query: dict):
result = self.db.products.find(query)
# 將結果轉換為Pydantic模型
return [Product(**item) for item in result]
def update(self, query: dict, data: Product):
# 將Pydantic模型轉換為字典
product_data = data.dict()
return self.db.products.update_one(query, {"$set": product_data})
def delete(self, query: dict):
return self.db.products.delete_one(query)
現在,我們可以使用 Pydantic 資料模型來創建、讀取、更新和刪除使用者和產品。這將提供更好的資料驗證和型別提示,同時利用多型性來處理不同的資料型別。