高性能 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 @   linuxTang  阅读(793)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示