pydantic 是啥?
pydantic库是一种常用的用于数据接口schema定义与检查的库。主要用于数据验证和规范
通过pydantic库,我们可以更为规范地定义和使用数据接口,这对于大型项目的开发将会更为友好。
当然,除了pydantic库之外,像是valideer库、marshmallow库、trafaret库以及cerberus库等都可以完成相似的功能,但是相较之下,pydantic库的执行效率会更加优秀一些。
使用pydantic
from pathlib import Path
from typing import List
from datetime import date
from pydantic import BaseModel,ValidationError
from pydantic.typing import Optional
class User(BaseModel):
name:str # 必填字段
age:int=17 # 有默认值
friends: List[int] = []
data ={
'name':'laijinbiao',
'age':18,
'friends':[1,2,'3'] # ‘3’ 可以被强转成整形的
}
data2 ={
'name':'laijinbiao',
'age':18,
'friends':[1,2,'kkk'] # ‘3’ 可以被强转成整形的
}
peo = User(**data) #创建对象
print(peo.name,peo.age,peo.friends) # 实例化调用属性
print('##############################错误示例#########################')
try:
User(name = 'lihua',age=10,friends=['1',2,'this is not a num']) # friends 填入错误的数据类型
except ValidationError as e:
print(e.json())
print('#########################模型类的方法和属性######################')
print(peo.dict()) # 把数据转换成字典格式
print(peo.json()) # 把数据转换成json格式
print(peo.copy()) #浅拷贝
print(User.parse_raw('{"name": "laijinbiao", "age": 18, "friends": [1, 2, 3]}')) #解析数据
print(User.parse_obj(peo)) #解析对象
# 解析文件
path = Path('pydantic_user.json')
path.write_text('{"name": "laijinbiao", "age": 18, "friends": [1, 2, 3]}')
print(User.parse_file(path))
#使用什么数据类型(json格式)
print(peo.schema())
print(peo.schema_json())
#不检验数据直接创建模型类,不建议在construct方法中传入未经验证的数据
print(User.construct(**data2))
print(User.__fields__.keys( ))#定义模型类的时候,所有字段都注明类型,字段顺序就不会乱
print( "###########################递归模型###########################" )
class Sound ( BaseModel) :
sound : str
class Dog(BaseModel):
birthday: date
weight: float = Optional [None]
sound: List[Sound]#不同的狗有不同的叫声。递归模型(Recursive Models)就是指一个嵌套一个
dog1 = Dog(birthday=date.today(),weight=99.9,sound=[Sound(sound='汪汪'),Sound(sound='呜呜')])
dog2 = Dog(birthday=date.today(),weight=99.8,sound=[{'sound':'汪汪'},{'sound':'唔西滴西'}])
print(dog1.dict())
print(dog2.dict())
**********************************结果打印*********************************
/home/zhongshan/.myvirtualenv/fastapi/bin/python /home/zhongshan/LearnFastApi/FistFast/UsedFile/pydantic_learn.py
laijinbiao 18 [1, 2, 3]
##############################错误示例#########################
[
{
"loc": [
"friends",
2
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
#########################模型类的方法和属性######################
{'name': 'laijinbiao', 'age': 18, 'friends': [1, 2, 3]}
{"name": "laijinbiao", "age": 18, "friends": [1, 2, 3]}
name='laijinbiao' age=18 friends=[1, 2, 3]
name='laijinbiao' age=18 friends=[1, 2, 3]
name='laijinbiao' age=18 friends=[1, 2, 3]
name='laijinbiao' age=18 friends=[1, 2, 3]
{'title': 'User', 'type': 'object', 'properties': {'name': {'title': 'Name', 'type': 'string'}, 'age': {'title': 'Age', 'default': 17, 'type': 'integer'}, 'friends': {'title': 'Friends', 'default': [], 'type': 'array', 'items': {'type': 'integer'}}}, 'required': ['name']}
{"title": "User", "type": "object", "properties": {"name": {"title": "Name", "type": "string"}, "age": {"title": "Age", "default": 17, "type": "integer"}, "friends": {"title": "Friends", "default": [], "type": "array", "items": {"type": "integer"}}}, "required": ["name"]}
name='laijinbiao' age=18 friends=[1, 2, 'kkk']
dict_keys(['name', 'age', 'friends'])
###########################递归模型###########################
{'birthday': datetime.date(2021, 6, 6), 'sound': [{'sound': '汪汪'}, {'sound': '呜呜'}]}
{'birthday': datetime.date(2021, 6, 6), 'sound': [{'sound': '汪汪'}, {'sound': '唔西滴西'}]}
Process finished with exit code 0
从实例中创建符合orm对象的模型
from datetime import datetime,date
from pathlib import Path
from typing import List, Optional
from pydantic import BaseModel,ValidationError, constr
from sqlalchemy import Column,Integer, String
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.ext.declarative import declarative_base
####################从实例中创建符合orm对象的模型#########################
Base = declarative_base()
# sqlalchemy 模型类 数据表
class CompanyOrm(Base) :
__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):
id:int
public_key: constr(max_length=20) #constr 限制字符串的长度
name: constr(max_length=63)
domains: List[constr(max_length=255)]
class Config:
orm_mode=True # 使用orm
# 数据表的模型类实例
co_orm = CompanyOrm(
id=123,
public_key= 'foobar',
name='Testing',
domains=['example.com', 'imooc.com']
)
print (CompanyMode.from_orm(co_orm))
# print('pydantic')
******************************打印结果************************************
/home/zhongshan/.myvirtualenv/fastapi/bin/python /home/zhongshan/LearnFastApi/FistFast/UsedFile/orm_.py
id=123 public_key='foobar' name='Testing' domains=['example.com', 'imooc.com']
pydantic
Process finished with exit code 0