fastapi pytantic补充

pytantic补充

class Sound(BaseModel):
	sound:str
	
class Person(BaseModel):
    name: str = "abc"  # 字符串类型,默认值是abc
    c:Optional[int]=None   # 或者c:Optional[int] 默认也是None 
    e:List[str]=[]
    sound:List[Sound]=[]
    
# 把数据传入定义的数据类,或者称作结构体,可以通过解包的方式
external_data = {"name":"aa","c":1,"e":["a","2"]}
person = Person(**external_data)
print(person.copy())  # 浅拷贝
print(Person.parse_obj(obj=external_data))   # 解析数据,注意解析使用的是类,不是实例
print(Person.construct(**external_data))  # 与parse_obj作用相同,区别是不做数据校验
print(Person.parse_raw('{"name":"aa","c":1,"e":["a","2"]}'))   # 字符串类型,但是是标准的k、v形式也可以
print(person.schema())
print(person.schema_json())
print(Person.__fields__.keys())   # 输出字段顺序,与定义模型类的顺序相同
a_person = Person(name="aa",c=1,e=["a","2"],sound=[{"sound":"嗯嗯啊啊"},{"sound":"嘤嘤"}]) 
# pycharm装pydantic插件后,可能会有警告`Expected type 'List[Sound]',got 'List[Dict[str,str]]'instead`,不影响

从实例创建符合sqlachemy的数据

创建pytandic模型,符合orm数据表的类型

from sqlalchemy import Column,Integer,String
from sqlalchemy.dialects.postgresql import ARRAY
from sqlclchemy.ext.declarative import declarative_base
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,unique=True)
    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=63)
    domains:List[constr(max_length=255)]
    class Config:
        orm_mode = True    # 表示pytantic建的数据格式与模型类相对应

to_orm = CompanyOrm(
    id=123,
    public_key='foobar',
    name='Testing',
    domains=['example.com','imooc.com']
)
print(CompanyMode.from_orm(to_orm))

在官网中 https://pydantic-docs.helpmanual.io/usage/types/#constrained-types 除了constr还有conint等,理解是使用这种方式后就不需要使用 name:[str] 的方式了 , 与Field的验证方式差不多,只是对不同数据格式的一种简写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值