1.pydantic庫介紹
pydantic 是一個基於python類型提示來定義數據驗證,序列化,文檔的庫 使用python的類型注解 來進行數據校驗和settings管理 pydantic可以在代碼運行時提供類型提示, 數據校驗失敗時提供友好的錯誤提示 定義數據應該如何在純規范的python中保存,並用pydantic驗證它 pydantic 是用來定義request請求body中數據類型,數據格式的 數據類型: int: 能夠轉化成int的數據類型 eg:1,'1' datetime: '2021-12-25 12:33' datetime數據類型的格式
2. 基於pydantic庫 BaseModel 來定義數據
from pydantic import BaseModel class User(BaseModel): """ 定義用戶對象 """ id: int # 數據庫存儲ID,自增 name: str = 'Json Snow' # 用戶名 默認值 Json Snow signup_ts: datetime # signup_ts 注冊時間: datetime 的數據類型 friends: List[int] = [] # 朋友,可能有多個 List[int] = [] 默認可以為空列表 external_data = { 'id': '222', # id--> int 'name': 'dong', 'signup_ts': '2021-12-23 03:56', 'friends': [1, 2, '55'] } # 實力化User對象 user = User(**external_data) print(user.name, user.friends) # dong [1, 2, 55] print(repr(user.signup_ts)) # repr函數將對象轉化為解釋器讀取的形式,str將數據解析成適合人閱讀的數據 # datetime.datetime(2021, 12, 23, 3, 56) print(str(user.signup_ts)) # 2021-12-23 03:56:00 print(user.dict()) # dict() 函數將對象轉化成字典 # {'id': 222, 'name': 'dong', 'signup_ts': datetime.datetime(2021, 12, 23, 3, 56), 'friends': [1, 2, 55]}
3. 通過pydantic庫 的ValidationError,來定義錯誤信息
from pydantic import ValidationError from datetime import datetime try: User(id=1, name='dong', signup_ts=datetime.today(), friends=[1, 2, 'not number']) except ValidationError as e: print(e.json()) #[ { "loc": [ "friends", 2 ], "msg": "value is not a valid integer", "type": "type_error.integer" } ]
4. 基於BaseModel類產生的對象的方法
from pydantic import BaseModel from typing import List, Optional from datetime import datetime class User(BaseModel): id: int name: Optional[str] = None signup_ts: datetime external_data = { 'id': '123', 'name': 'John', 'signup_ts': datetime.today() } user = User(**external_data) print(user.dict()) # user對象的dict()形式 # {'id': 222, 'name': 'dong', 'signup_ts': datetime.datetime(2021, 12, 23, 3, 56), 'friends': [1, 2, 55]} print(user.json()) # user對象的json()形式 # {"id": 222, "name": "dong", "signup_ts": "2021-12-23T03:56:00", "friends": [1, 2, 55]} print(user.copy()) # 淺拷貝
5.pydantic 基於類的方法
class User(BaseModel): """ 定義用戶對象 """ id: int # 數據庫存儲ID,自增 name: str = 'Json Snow' # 用戶名 默認值 Json Snow signup_ts: datetime # signup_ts 注冊時間: datetime 的數據類型 friends: List[int] = [] # 朋友,可能有多個 List[int] = [] 默認可以為空列表 print(User.parse_obj(obj=user)) print(User.parse_raw('{"id": 222, "name": "dong", "signup_ts": "2021-12-23T03:56:00", "friends": ' '[1, 2, 55]}')) # 解析規范的,原生的key-value字符串只能是json格式的
6. Path的使用 from pathlib import path
from pathlib import Path # 通過Path寫一個json文件 path = Path('pydantic_tutorial.json') path.write_text('{"id": 222, "name": "dong", "signup_ts": "2018-9-10 5:36", "friends":[1,2,3]}') print(User.parse_file(path)) # id=222 name='dong' signup_ts=datetime.datetime(2018, 9, 10, 5, 36) friends=[1, 2, 3]
7. user.schema; user.schema_json; user.construct; User.__fields__keys
print(user.schema()) # {'title': 'User', 'description': '定義用戶對象 ', 'type': 'object', 'properties': {'id': {'title': 'Id', 'type': 'integer'}, 'name': {'title': 'Name', 'default': 'Json Snow', 'type': 'string'}, 'signup_ts': {'title': 'Signup Ts', 'type': 'string', 'format': 'date-time'}, 'friends': {'title': 'Friends', 'default': [], 'type': 'array', 'items': {'type': 'integer'}}}, 'required': ['id', 'signup_ts']} print(user.schema_json()) print(user.construct()) # 數據必須是安全的數據,不提供校驗 print(User.__fields__.keys()) # 字段不會亂,所有字段都注明類型,字段順序不會亂 # dict_keys(['id', 'name', 'signup_ts', 'friends'])
8. pydantic 實現類的遞歸
class Sound(BaseModel): sound: str class Dog(BaseModel): birth: date weight: float = Optional[None] sound: List[Sound] # 嵌套 Sound類 sound字段是鍵, str是值 dogs = Dog(birth=date.today(), weight=6.66, sound=[{'sound': 'wang wang~'}, {'sound': 'lu lu~'}]) print(dogs.dict())
ORM 模型
from sqlalchemy import Column, Integer, String from sqlalchemy.dialects.postgresql import ARRAY from sqlalchemy.ext.declarative import declarative_base from pydantic import BaseModel, ValidationError, constr # ORM模型: 從類實例創建符合ORM對象的模型 Base = declarative_base() # ORM模型 class CompanyOrm(Base): """ from sqlalchemy import Column,Integer,String ORM模型中 Column用來定義字段 數據類型: Integer 整形, String 字符串, 數組ARRAY """ __tablename__ = 'companies' id = Column(Integer, primary_key=True, nullable=False) public_key = Column(String(20), index=True, nullable=False, unique=True) # 創建索引 name = Column(String(63), unique=True) domains = Column(ARRAY(String(255))) # pydantic類 class CompanyMode(BaseModel): """ pydantic類定義數據格式的類 """ id: int public_key: constr(max_length=20) name: constr(max_length=63) domains: List[constr(max_length=255)] class Config: orm_mode = True # 創建ORM類的對象 co_orm = CompanyOrm( id=123, public_key='foorbar', name='dong', domains=['simple.com', 'imoo.com'] ) ''' co_orm 是ORM模型類的實例化對象 數據表的一行數據 CompanyMode 是padantic類 用來規范和驗證數據格式的 pydantic 支持的所有文檔類型: http://pydantic-docs.helpmanual.io/usage/types/ ''' print(CompanyMode.from_orm(co_orm))
# id=123 public_key='foorbar' name='dong' domains=['simple.com', 'imoo.com']