0
点赞
收藏
分享

微信扫一扫

高性能 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))

 



举报

相关推荐

0 条评论