前言

为啥要学这个,因为 FastAPI 是基于它进行开发的,而且是个不错的框架,所以有必要深入学习

前置学习

Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html

typing 模块:https://www.cnblogs.com/poloyy/p/15150315.html

Pydantic 介绍

  • 使用 python 类型注释来进行数据校验和 settings 管理
  • pydantic 可以在代码运行时强制执行类型提示,并在数据校验无效时提供友好的错误提示
  • 定义数据应该如何在规范的 python 代码中保存,然后通过 Python 验证它

Pydantic 安装

pip install pydantic

测试 pydantic 是否已编译

import pydantic

print('compiled:', pydantic.compiled)

# 输出结果
compiled: True

Pydantic 注意事项

  • pydantic 是一个解析库,而不是一个验证库
  • 验证是达到目的一种手段,构建符合所提供的类型和约束的模型
  • 简单来说:pydantic 保证输出模型的类型和约束,而不是输入数据

Models

简介

  • 在 pydantic 中定义对象的主要方法是通过模型(模型是从 BaseModel 继承的类)
  • 所有基于 pydantic 的数据类型本质上都是一个 BaseModel 
  • 可以将模型视为强类型语言中的类型(比如 Java)
  • 不受信任的数据可以传递给模型,经过解析和验证后,pydantic 保证生成的模型实例的字段将符合定义的字段类型(实例字段类型符合类定义的字段类型)

基础模型使用

from pydantic import BaseModel

class User(BaseModel):
id: int
name = "小菠萝测试笔记"
  • User 就是一个模型(Models),有两个字段(属性)
  • id,整数 int 类型,是必传的
  • name,字符串 string 类型,不是必传,有默认值

为什么能知道 name 是 string 类型?

因为默认值是 string 类型,因此不需要类型提示( name : string )

注意:当某些字段没有类型提示时,需要注意有关字段顺序的警告

声明一个有效实例

user = User(id='123')
  • user 是 User 模型的一个实例对象,就叫模型实例对象吧
  • 对象的初始化会执行所有解析和验证,如果没有抛出 ValidationError,证明生成的模型实例是有效的

访问模型实例对象的属性

user = User(id='123')
print(user.id, type(user.id))
print(user.name, type(user.name)) # 输出结果
123 <class 'int'>
小菠萝测试笔记 <class 'str'>
  • id 属性传的是字符串 '123',它会根据模型字段类型进行转换为 int
  • name 属性取了默认值

__fields_set__

该变量返回用户初始化对象时提供了什么字段

# __fields_set__
user = User(id='123') print(user.__fields_set__ == {'id'})
print(user.__fields_set__ == {'name'}) user = User(id='123', name="test") print(user.__fields_set__ == {'id', 'name'})
print(user.__fields_set__ == {'id'}) # 输出结果
True
False
True
False

dict()

可以提供字段的字典对象

# dict()
user = User(id='123')
print(user.dict())
print(dict(user)) # 输出结果
{'id': 123, 'name': '小菠萝测试笔记'}
{'id': 123, 'name': '小菠萝测试笔记'}

修改模型实例对象的属性

# 修改模型实例属性值
user = User(id='123')
user.id = 321
print(user.id) # 输出结果
321

Models 属性

其实就是 BaseModels 有什么自带的方法、属性

dict()

返回模型字段和值,字典格式

user = User(id='123', name="test")
print(user.dict(), type(user.dict())) # 输出结果
{'id': 123, 'name': 'test'} <class 'dict'>

json()

返回模型字段和值,json 字符串格式

user = User(id='123', name="test")
print(user.json(), type(user.json())) # 输出结果
{"id": 123, "name": "test"} <class 'str'>

schema()

以 JSON Schema 形式返回模型,字典格式

user = User(id='123', name="test")

print(user.schema(), type(user.schema()))

# 输出结果
{
"title": "User",
"type": "object",
"properties": {
"id": {
"title": "Id",
"type": "integer"
},
"name": {
"title": "Name",
"default": "小菠萝测试笔记",
"type": "string"
}
},
"required": [
"id"
]
} <class 'dict'>

schema_json()

以 JSON Schema 形式返回模型,json 字符串格式

user = User(id='123', name="test")

print(user.schema_json(), type(user.schema_json()))

# 输出结果
{
"title": "User",
"type": "object",
"properties": {
"id": {
"title": "Id",
"type": "integer"
},
"name": {
"title": "Name",
"default": "小菠萝测试笔记",
"type": "string"
}
},
"required": [
"id"
]
} <class 'str'>

copy()

浅拷贝模型对象

Python - pydantic 入门介绍与 Models 的简单使用的更多相关文章

  1. Dubbo入门介绍---搭建一个最简单的Demo框架

    Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbozookeeper 更多 个人分类: D ...

  2. 【python】入门:打印字符串、简单计算

  3. [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍

    前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...

  4. [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)

    最近在使用Python爬取网页内容时,总是遇到JS临时加载.动态获取网页信息的困难.例如爬取CSDN下载资源评论.搜狐图片中的“原图”等,此时尝试学习Phantomjs和CasperJS来解决这个问题 ...

  5. Python入门介绍

    Python入门介绍(人生苦短,我用 Python) Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹 ...

  6. Python 基于python操纵redis入门介绍

    基于python操纵redis入门介绍 by:授客  QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3.3.2 基于Python操作R ...

  7. python从入门到大神---4、python3文件操作最最最最简单实例

    python从入门到大神---4.python3文件操作最最最最简单实例 一.总结 一句话总结: python文件操作真的很简单,直接在代码中调用文件操作的函数比如open().read(),无需引包 ...

  8. Python 正则表达式入门(中级篇)

    Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...

  9. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

随机推荐

  1. MYSQL数据库数据拆分之分库分表总结 (转)

      数据存储演进思路一:单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 数据存储演进思路二:单库多表 随着用户数 ...

  2. FreeRTOS+LVGL|Freertos+lvgl如何配置lvgl的心跳和任务管理器

    目录 配置lvgl心跳(Tick) 配置lvgl任务管理器(Task Handler) LVGL中文手册 lvgl需要系统滴答声(心跳)才能知道动画和其他任务的经过时间,所以我们必须要配置好lvgl的 ...

  3. CDN相关知识及CDN绕过

    #什么是CDN? 内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络.CDN应用广泛,支持多种行业 ...

  4. python使用笔记23--面向对象编程

    1.面向对象编程概念 面向对象是包含面向过程 面向过程编程 买车: 1.4s看车,买车 2.上保险 保险公司 3.交税 地税局 4.交管所 上牌 面向对象编程 卖车处: 1.4s 2.保险 3.交税 ...

  5. python -- 程序结构

    一.程序结构 • 定义python文件的头部模板:在File->Settings->Editor->File and Code Templates->Python script ...

  6. 虚拟机安装RHEL8.0.0

    在VMware Workstations 15.0.0中安装RHEL8.0.0 使用到的软件和主机基本配置 此处宿主机基本硬件配置:i3-7100U 4核,内存:12G 虚拟化软件:VMware Wo ...

  7. 运行ride.py报错,闪退

    报错信息如下: F:\Python3.8\Scripts>python ride.py<class 'robotide.preferences.configobj.UnreprError' ...

  8. like %和-的区别与使用

    通配符的分类: %百分号通配符:表示任何字符出现任意次数(可以是0次). 下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符. like操作符: LIKE作用是指示mysql后面的搜索模 ...

  9. lwIP(Light Weight IP)协议

    信号量 信号量结构体:struct sys_semt struct _sys_sem { void *sem; };  err_t sys_sem_new(sys_sem_t *sem, u8_t c ...

  10. Django的ORM如何执行group by 语句

    问题描述: 使用Django的ORM建立了如下Model: class Book(models.Model): name = models.CharField(max_length=300) page ...