pydantic是一个关于数据格式和校验的包,它可以自动打数字字符串转换成int,也可以直接把对象转换成字典和json串,举例说明:
1我定义一个模型类 2我定义一个约束模型类的pydantic
3通过pydantic把实例格式化成我们想要的数据
示例一:
创建符合ORM对象的模型
from sqlalchemy import Column, Integer, String from sqlalchemy.dialects.postgresql import ARRAY from sqlalchemy.ext.declarative import declarative_base from pydantic import BaseModel, constr Base = declarative_base() #模型类 class CompanyOrm(Base): __tablename__ == 'companies' id = Column(Integer, primary_key=True, nullable=False) public_key = Column(String(20),index=True,nullable=False) name = Column(String(63), unique=True) #将多个域名放到元组里,一个字符串就是一个域名 domains = Column(ARRAY(String(255))) #对模型类的数据格式进行规范 class CompanyMode(BaseModel): id:int public_key:constr(max_length=20) name: constr(max_length=163) domains: List[constr(max_length=255)] #表示建立数据格式和模型类是对应的 class Config: orm_mode = True #实例化模型类 co_orm = CompanyOrm( id = 123, public_key = 'foobar', name = 'Testing', domains = ['tangyingjie.com','example.com'] ) #把实例格式化成我们需要的数据类型 print(CompanyMode.from_orm(co_orm))
示例二:
假如说我要把实例external_data格式化成我规定的数据类型:
#我规定的数据类型: class User(BaseModel): id:int name:str = "john sown" signup_ts:Optional[datetime]=Npne #是按字段不填就设为Null friends: List[int] = [] #朋友有很多,所以是一个列表,默认是一个空列表 #实例 external_data = { "id":"123", "signup_ts":"2022-01-02 12:39", "friends":[1,2,"3"] } #实例化 user = User(**external_data) #1实例化后调用属性 print(repr(user.signup_ts)) #将对象转换成供解释器读取的形式 print(dict(user)) #把对象转换成字典 print(user.dict()) #把对象转换成字典 print(user.json()) #把最想转换成json print(user.copy()) #浅拷贝对象 #用于规定数据类型的类里的的parse_obj可以直接解析字典数据对象 print(User.parse_obj(obj=external_data)) #用于规定数据类型的类里的oarse_raw可以直接解析key-value形式的字符串 print(User.parse_raw('{"id":"123","signup_ts":"2021-01-02 13:28"}')) #通过__fields__.key()方法可以查看“规定数据类型类里”里面的所有字段 print(User.__fields__keys()) #用于规定数据类型的类里的construct()方法不会校验数据而直接创建模型(用的时候要小心) user_data={"id":"error","signup_ts":"2021-01-02 13:28"} print(User.construct(**user_data))
示例三
用于规定数据类型的类(pydantic类)可以递归使用,所谓递归就是在一个模型里调用另外一个模型
class Sound(BaseModel): sound: str class Dog(BaseModel): birthday: data weight :float sound: List[Sound] #不同的狗有不同的叫声 dogs = Dog(birthday=date.today(), weight=6.99,sound=[{"sound":"wang wang"},{"sound":"ao ao"}]) print(dogs.dict())
示例四:
FastAPI生成文件并写入内容的方法:
from pathlib import Path #指定当前路径下的文件名 path = Path('pydantic_tutorial_data') #在文件里写内容 path.write_text('{"id":"123","signup_ts":"2021-01-02 13:28""}') #把文件内容传给规定数据类型的类里进行实例化 print(User.parse_file(path))