高性能 FastAPI 框架入门精讲-1Pydantic的基本用法

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))

 

posted @ 2022-01-02 19:26  linuxTang  阅读(721)  评论(0编辑  收藏  举报