pydantic库


1.pydantic库介绍

pydantic 是一个基于python类型提示来定义数据验证,序列化,文档的库
使用python的类型注解 来进行数据校验和settings管理
pydantic可以在代码运行时提供类型提示, 数据校验失败时提供友好的错误提示
定义数据应该如何在纯规范的python中保存,并用pydantic验证它
pydantic 是用来定义request请求body中数据类型,数据格式的
数据类型:
   int: 能够转化成int的数据类型 eg:1,'1'
   datetime: '2021-12-25 12:33' datetime数据类型的格式

2. 基于pydantic库 BaseModel 来定义数据

from pydantic import BaseModel


class User(BaseModel):
    """ 定义用户对象 """
    id: int  # 数据库存储ID,自增
    name: str = 'Json Snow'  # 用户名 默认值 Json Snow
    signup_ts: datetime  # signup_ts 注册时间: datetime 的数据类型
    friends: List[int] = []  # 朋友,可能有多个 List[int] = [] 默认可以为空列表


external_data = {
    'id': '222',  # id--> int
    'name': 'dong',
    'signup_ts': '2021-12-23 03:56',
    'friends': [1, 2, '55']
}

# 实力化User对象
user = User(**external_data)
print(user.name, user.friends)
# dong [1, 2, 55]
print(repr(user.signup_ts))  # repr函数将对象转化为解释器读取的形式,str将数据解析成适合人阅读的数据
# datetime.datetime(2021, 12, 23, 3, 56)
print(str(user.signup_ts))
# 2021-12-23 03:56:00
print(user.dict())  # dict() 函数将对象转化成字典
# {'id': 222, 'name': 'dong', 'signup_ts': datetime.datetime(2021, 12, 23, 3, 56), 'friends': [1, 2, 55]}

3. 通过pydantic库 的ValidationError,来定义错误信息

from pydantic import ValidationError
from datetime import datetime

try:
    User(id=1, name='dong', signup_ts=datetime.today(), friends=[1, 2, 'not number'])
except ValidationError as e:
    print(e.json())

#[
  {
    "loc": [
      "friends",
      2
    ],
    "msg": "value is not a valid integer",
    "type": "type_error.integer"
  }
]

4. 基于BaseModel类产生的对象的方法

from pydantic import BaseModel
from typing import List, Optional
from datetime import datetime

class User(BaseModel):
     id: int
     name: Optional[str] = None
     signup_ts: datetime

external_data = {
     'id': '123',
     'name': 'John',
     'signup_ts': datetime.today()
    
}
     
user = User(**external_data)
print(user.dict())  # user对象的dict()形式
# {'id': 222, 'name': 'dong', 'signup_ts': datetime.datetime(2021, 12, 23, 3, 56), 'friends': [1, 2, 55]}
print(user.json())  # user对象的json()形式
# {"id": 222, "name": "dong", "signup_ts": "2021-12-23T03:56:00", "friends": [1, 2, 55]}
print(user.copy())  # 浅拷贝

5.pydantic 基于类的方法

class User(BaseModel):
    """ 定义用户对象 """
    id: int  # 数据库存储ID,自增
    name: str = 'Json Snow'  # 用户名 默认值 Json Snow
    signup_ts: datetime  # signup_ts 注册时间: datetime 的数据类型
    friends: List[int] = []  # 朋友,可能有多个 List[int] = [] 默认可以为空列表


print(User.parse_obj(obj=user))
print(User.parse_raw('{"id": 222, "name": "dong", "signup_ts": "2021-12-23T03:56:00", "friends": '
                     '[1, 2, 55]}'))  # 解析规范的,原生的key-value字符串只能是json格式的

6. Path的使用 from pathlib import path

from pathlib import Path
# 通过Path写一个json文件

path = Path('pydantic_tutorial.json')
path.write_text('{"id": 222, "name": "dong", "signup_ts": "2018-9-10 5:36", "friends":[1,2,3]}')
print(User.parse_file(path))
# id=222 name='dong' signup_ts=datetime.datetime(2018, 9, 10, 5, 36) friends=[1, 2, 3]

7. user.schema;            user.schema_json;            user.construct;    User.__fields__keys

print(user.schema())  
# {'title': 'User', 'description': '定义用户对象 ', 'type': 'object', 'properties': {'id': {'title': 'Id', 'type': 'integer'}, 'name': {'title': 'Name', 'default': 'Json Snow', 'type': 'string'}, 'signup_ts': {'title': 'Signup Ts', 'type': 'string', 'format': 'date-time'}, 'friends': {'title': 'Friends', 'default': [], 'type': 'array', 'items': {'type': 'integer'}}}, 'required': ['id', 'signup_ts']}
print(user.schema_json())
print(user.construct())  # 数据必须是安全的数据,不提供校验

print(User.__fields__.keys())  # 字段不会乱,所有字段都注明类型,字段顺序不会乱
# dict_keys(['id', 'name', 'signup_ts', 'friends'])

8.  pydantic 实现类的递归

class Sound(BaseModel):
    sound: str


class Dog(BaseModel):
    birth: date
    weight: float = Optional[None]
    sound: List[Sound]


# 嵌套 Sound类 sound字段是键, str是值
dogs = Dog(birth=date.today(), weight=6.66, sound=[{'sound': 'wang wang~'}, {'sound': 'lu lu~'}])
print(dogs.dict())

ORM 模型

from sqlalchemy import Column, Integer, String
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.ext.declarative import declarative_base
from pydantic import BaseModel, ValidationError, constr

# ORM模型: 从类实例创建符合ORM对象的模型
Base = declarative_base()


# ORM模型
class CompanyOrm(Base):

    """
    from sqlalchemy import Column,Integer,String
    ORM模型中 Column用来定义字段
    数据类型: Integer 整形, String 字符串, 数组ARRAY
    """
    __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)))


# pydantic类
class CompanyMode(BaseModel):
    """
    pydantic类定义数据格式的类
    """

    id: int
    public_key: constr(max_length=20)
    name: constr(max_length=63)
    domains: List[constr(max_length=255)]

    class Config:
        orm_mode = True


# 创建ORM类的对象
co_orm = CompanyOrm(
    id=123,
    public_key='foorbar',
    name='dong',
    domains=['simple.com', 'imoo.com']
)

'''
 co_orm 是ORM模型类的实例化对象 数据表的一行数据
 CompanyMode 是padantic类 用来规范和验证数据格式的
 pydantic 支持的所有文档类型: http://pydantic-docs.helpmanual.io/usage/types/
 
'''
print(CompanyMode.from_orm(co_orm))

# id=123 public_key='foorbar' name='dong' domains=['simple.com', 'imoo.com']

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM