pydantic庫


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']

 


免責聲明!

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



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