【PY模块】pydantic 基础类 BaseModel 用法

说明

pydantic 库是 python 中用于数据接口定义检查设置管理的库。

pydantic 在运行时强制执行类型提示,并在数据无效时提供友好的错误

安装:pip install pydantic

BaseModel 基本使用

from pydantic import BaseModel

class Info(BaseModel):
    id: int
    name: str

if __name__ == '__main__':
    # 实例化使用方式
    info = {'id': 1, 'name': 'Bob'}
    print(Info(**info))
    print(Info(id='1', name='Bob'))
    print(Info(id=1, name='Bob').id)
    print(Info(id=1, name='Bob').name)
    print(Info(id=1, name='Bob').json())
    print(Info(id=1, name='Bob').dict())
    print(Info(id=1, name='Bob').copy())  # 浅拷贝
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
id=1 name='Bob'
id=1 name='Bob'
1
Bob
{"id": 1, "name": "Bob"}
{'id': 1, 'name': 'Bob'}
id=1 name='Bob'

BaseModel 错误提示

错误提示很详细

from pydantic import BaseModel, ValidationError

class Info(BaseModel):
    id: int
    name: str

if __name__ == '__main__':
    try:
        print(Info(id=1, name=[12, 34]))
    except ValidationError as e:
        print(e.json())
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# 提示很详细
[
  {
    "loc": [
      "name"
    ],
    "msg": "str type expected",
    "type": "type_error.str" 
  }
]

BaseModel 默认验证类型

其他类型:https://pydantic-docs.helpmanual.io/usage/types/

相关限制

  • conlist:
    • item_type: Type[T]: 列表项的类型
    • min_items: int = None: 列表中的最小项目数
    • max_items: int = None: 列表中的最大项目数
  • conset:
    • item_type: Type[T]: 列表项的类型
    • min_items: int = None: 集合中的最小项目数
    • max_items: int = None: 集合中的最大项目数
  • conint:
    • strict: bool = False: 控制类型强制
    • gt: int = None: 强制整数大于设定值
    • ge: int = None: 强制整数大于或等于设定值
    • lt: int = None: 强制整数小于设定值
    • le: int = None: 强制整数小于或等于设定值
    • multiple_of: int = None: 强制整数为设定值的倍数
  • confloat:
    • strict: bool = False: 控制类型强制
    • gt: int = None: 强制浮点数大于设定值
    • ge: int = None: 强制浮点数大于或等于设定值
    • lt: int = None: 强制浮点数小于设定值
    • le: int = None: 强制浮点数小于或等于设定值
    • multiple_of: int = None: 强制浮点数为设定值的倍数
  • constr:
    • strip_whitespace: bool = False: 删除前尾空格
    • to_lower: bool = False: 将所有字符转为小写
    • strict: bool = False: 控制类型强制
    • min_length: int = None: 字符串的最小长度
    • max_length: int = None: 字符串的最大长度
    • regex: str = None: 正则表达式来验证字符串
from pydantic import BaseModel, constr, conint
from typing import List
from datetime import date

class Info(BaseModel):
    id: int  # 整形
    name: str  # 字符串
    age: conint(gt=0, le=100)  # gt > 、ge >=、lt < 、le <=
    time: date
    is_boy: bool  # 布尔
    friend: List[str] = None  # 有默认值 (此参数可选)自定义组合
    hobby: List[constr(max_length=255)]  # 现在 str 长度

if __name__ == '__main__':
    print(Info(id=1, name='Bob', age=12, time="2001-12-23", is_boy=True, friend=['A', 'B'], hobby=['CC', 'DD']).json())
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
{"id": 1, "name": "Bob", "age": 12, "time": "2001-12-23", "is_boy": true, "friend": ["A", "B"], "hobby": ["CC", "DD"]}

BaseModel 子类嵌套

from pydantic import BaseModel, constr, conint
from typing import Optional

class City(BaseModel):
    city_name: str
    description: constr(max_length=255)

class Info(BaseModel):
    id: int  # 整形
    name: str  # 字符串
    age: Optional[conint(gt=0, le=100)]  # 可选 gt > 、ge >=、lt < 、le <=
    city: City

if __name__ == '__main__':
    print(Info(id=1, name='Bob', age=12, city={'city_name': '成都', 'description': '好地方'})..dict()) # json 中文会被编码
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# {"id": 1, "name": "Bob", "age": 12, "city": {"city_name": "\u6210\u90fd", "description": "\u597d\u5730\u65b9"}}
{'id': 1, 'name': 'Bob', 'age': 12, 'city': {'city_name': '成都', 'description': '好地方'}}

从 ORM对象模型 创建 BaseModel 实例

这的 ORM对象模型使用的 SQLAlchemy 模块

安装:pip3 instaill SQLAlchemy

创建 ORM对象模型

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class ORMInfo(Base):  # 创建 ORM 映射
    __tablename__ = 'orm_info'
    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    name = Column(String(100), unique=True, nullable=False)
    city = Column(String(100), unique=True, nullable=False)

from pydantic import BaseModel, constr

class ModelInfo(BaseModel):  # 创建与 ORM 对应的 BaseModel 类
    id: int
    name: constr(max_length=100)
    city: constr(max_length=100)

    class Config:
        orm_mode = True  # 默认 False,需要从 ORM 实例化数据需要设置 True

orm_info = ORMInfo(
    id=1, name='Bob', city='zx')
print(orm_info)
model_info = ModelInfo.from_orm(orm_info)  # 从 ORM模型 实例化数据
print(model_info)

mark

发表评论 / Comment

用心评论~