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