pydantic库
life is wonderful1.pydantic库介绍
pydantic 是⼀个基于python类型提⽰来定义数据验证,序列化,⽂档的库
使⽤python的类型注解来进⾏数据校验和ttings管理
pydantic可以在代码运⾏时提供类型提⽰, 数据校验失败时提供友好的错误提⽰
ca是什么意思
定义数据应该如何在纯规范的python中保存,并⽤pydantic验证它
pydantic 是⽤来定义request请求body中数据类型,数据格式的
数据类型:
int: 能够转化成int的数据类型 eg:1,'1'
datetime: '2021-12-25 12:33' datetime数据类型的格式
2. 基于pydantic库 BaModel 来定义数据
from pydantic import BaModel
class Ur(BaModel):
""" 定义⽤户对象 """
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']
}
# 实⼒化Ur对象
ur = Ur(**external_data)
print(ur.name, ur.friends)
# dong [1, 2, 55]
print(repr(ur.signup_ts)) # repr函数将对象转化为解释器读取的形式,str将数据解析成适合⼈阅读的数据
# datetime.datetime(2021, 12, 23, 3, 56)
print(str(ur.signup_ts))
# 2021-12-23 03:56:00
print(ur.dict()) # dict() 函数将对象转化成字典
# {'id': 222, 'name': 'dong', 'signup_ts': datetime.datetime(2021, 12, 23, 3, 56), 'friends': [1, 2, 55]}cri
3. 通过pydantic库的ValidationError,来定义错误信息
from pydantic import ValidationError
from datetime import datetime
try:
Ur(id=1, name='dong', signup_day(), friends=[1, 2, 'not number'])
except ValidationError as e:
print(e.json())
#[
{
"loc": [
knowledgeable>active sync
"friends",
2
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
4. 基于BaModel类产⽣的对象的⽅法
from pydantic import BaModel
from typing import List, Optional
from datetime import datetime
class Ur(BaModel):
id: int
name: Optional[str] = None
signup_ts: datetime
external_data = {
'id': '123',
'name': 'John',
'signup_ts': day()
}
ur = Ur(**external_data)
print(ur.dict()) # ur对象的dict()形式
# {'id': 222, 'name': 'dong', 'signup_ts': datetime.datetime(2021, 12, 23, 3, 56), 'friends': [1, 2, 55]}
print(ur.json()) # ur对象的json()形式
# {"id": 222, "name": "dong", "signup_ts": "2021-12-23T03:56:00", "friends": [1, 2, 55]}
py()) # 浅拷贝
5.pydantic 基于类的⽅法
class Ur(BaModel):
""" 定义⽤户对象 """
id: int # 数据库存储ID,⾃增
name: str = 'Json Snow'# ⽤户名默认值 Json Snow
signup_ts: datetime # signup_ts 注册时间: datetime 的数据类型
friends: List[int] = [] # 朋友,可能有多个 List[int] = [] 默认可以为空列表
print(Ur.par_obj(obj=ur))
print(Ur.par_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(Ur.par_file(path))
# id=222 name='dong' signup_ts=datetime.datetime(2018, 9, 10, 5, 36) friends=[1, 2, 3]
7. ur.schema; ur.schema_json; ur.construct; Ur.__fields__keys
print(ur.schema())
# {'title': 'Ur', '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': 'Frie print(ur.schema_json())
struct()) # 数据必须是安全的数据,不提供校验
print(Ur.__fields__.keys()) # 字段不会乱,所有字段都注明类型,字段顺序不会乱
认字的方法有哪些
# dict_keys(['id', 'name', 'signup_ts', 'friends'])
8. pydantic 实现类的递归
swiss balance>身份证查六级准考证
class Sound(BaModel):
sound: str
class Dog(BaModel):
birth: date
weight: float = Optional[None]
sound: List[Sound]
# 嵌套 Sound类 sound字段是键, str是值
dogs = Dog(day(), 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
declarative import declarative_ba
from pydantic import BaModel, ValidationError, constr
# ORM模型: 从类实例创建符合ORM对象的模型
Ba = declarative_ba()
# ORM模型
class CompanyOrm(Ba):
"""
from sqlalchemy import Column,Integer,String
ORM模型中 Column⽤来定义字段
数据类型: Integer 整形, String 字符串, 数组ARRAY
"""
__tablename__ = 'companies'
id = Column(Integer, primary_key=True, nullable=Fal)
public_key = Column(String(20), index=True, nullable=Fal, unique=True) # 创建索引
name = Column(String(63), unique=True)
domains = Column(ARRAY(String(255)))
# pydantic类
class CompanyMode(BaModel):
"""
pydantic类定义数据格式的类
"""
codecid: 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=['', '']
)
'''
co_orm 是ORM模型类的实例化对象数据表的⼀⾏数据
CompanyMode 是padantic类⽤来规范和验证数据格式的
pydantic ⽀持的所有⽂档类型: pydantic-docs.helpmanual.io/usage/types/
'''
郑博闻print(CompanyMode.from_orm(co_orm))
# id=123 public_key='foorbar' name='dong' domains=['', '']