6 Pydantic 模型简介

在 Python 中,数据验证和序列化是构建 Web 应用、API 和微服务时常见的需求。Pydantic 是一个用于数据验证和设置管理的 Python 库,广泛应用于 FastAPI 中。它允许开发者通过简单的 Python 类来定义数据结构,自动进行数据验证、转换,并生成清晰、易用的接口。

本文将介绍 Pydantic 模型的基础知识,包括如何定义模型、进行数据验证和转换、以及如何使用 Pydantic 的其他特性。

1. 安装 Pydantic

要使用 Pydantic,我们首先需要安装它。你可以通过以下命令进行安装:


pip install pydantic

2. Pydantic 基本模型定义

Pydantic 的核心功能是通过创建继承自 pydantic.BaseModel 的类来定义数据模型。这个类提供了自动的数据验证、序列化和反序列化功能。

2.1 定义一个简单的模型

首先,定义一个简单的 Pydantic 模型来描述一个用户信息:

from pydantic import BaseModel

class User(BaseModel):
    name: str
    age: int
    email: str

在这个例子中,User 类继承自 BaseModel,定义了三个字段:name(字符串类型)、age(整数类型)和 email(字符串类型)。

2.2 创建模型实例

你可以通过传入字典或者关键字参数来创建 Pydantic 模型实例:

user = User(name="John Doe", age=30, email="john.doe@example.com")
print(user)

这将输出:


name='John Doe' age=30 email='john.doe@example.com'

Pydantic 自动将数据转换为相应的类型,并且可以通过模型实例访问各个字段。

3. 数据验证

Pydantic 会根据字段类型自动进行数据验证。如果传入的数据不符合指定类型,Pydantic 会抛出 ValidationError

3.1 示例:验证数据类型

from pydantic import ValidationError

try:
    user = User(name="John Doe", age="30", email="john.doe@example.com")
except ValidationError as e:
    print(e)

输出:

1 validation error for User
age
  str type expected (type=value_error.str)

在这个例子中,我们传入了字符串 "30"age 字段,而 age 期望是一个整数。因此,Pydantic 会抛出一个验证错误,并指出字段类型不匹配。

3.2 自定义验证器

你还可以使用 @validator 装饰器为模型字段添加自定义验证逻辑。例如,验证邮箱是否符合基本格式:

from pydantic import validator

class User(BaseModel):
    name: str
    age: int
    email: str

    @validator('email')
    def email_must_contain_at_symbol(cls, v):
        if '@' not in v:
            raise ValueError('Email must contain @ symbol')
        return v

如果邮箱地址不符合验证规则,Pydantic 会抛出 ValidationError

4. 数据转换

Pydantic 模型不仅能够验证数据类型,还能够将数据转换为正确的类型。例如,将字符串 "30" 自动转换为整数 30

python复制编辑user = User(name="Jane Doe", age="30", email="jane.doe@example.com")
print(user.age)  # 输出: 30 (整数类型)

5. 模型的序列化与反序列化

Pydantic 模型提供了 dict()json() 方法,方便将模型数据转换为字典或 JSON 格式。

5.1 转换为字典

user = User(name="Alice", age=25, email="alice@example.com")
user_dict = user.dict()
print(user_dict)

输出:

{'name': 'Alice', 'age': 25, 'email': 'alice@example.com'}

5.2 转换为 JSON

ser_json = user.json()
print(user_json)

输出:

{"name": "Alice", "age": 25, "email": "alice@example.com"}

json() 方法返回一个 JSON 格式的字符串,可以方便地与 Web 应用和 API 进行交互。

6. 嵌套模型

Pydantic 支持嵌套模型,你可以定义一个模型中的字段为其他 Pydantic 模型。

6.1 示例:嵌套模型

from typing import List

class Address(BaseModel):
    street: str
    city: str
    postal_code: str

class User(BaseModel):
    name: str
    age: int
    email: str
    addresses: List[Address]

# 创建一个用户和地址的实例
user_data = {
    'name': 'Bob',
    'age': 40,
    'email': 'bob@example.com',
    'addresses': [
        {'street': '123 Main St', 'city': 'Springfield', 'postal_code': '12345'},
        {'street': '456 Oak St', 'city': 'Shelbyville', 'postal_code': '67890'}
    ]
}

user = User(**user_data)
print(user)

输出:


name='Bob' age=40 email='bob@example.com' addresses=[Address(street='123 Main St', city='Springfield', postal_code='12345'), Address(street='456 Oak St', city='Shelbyville', postal_code='67890')]

在这个例子中,User 模型的 addresses 字段是一个 Address 模型的列表。Pydantic 会自动处理嵌套模型的验证和数据转换。

7. Pydantic 的更多特性

Pydantic 提供了许多其他功能,包括:

  • 数据的默认值:可以为模型字段提供默认值。
  • 枚举类型:支持枚举类型字段,自动验证输入值是否符合定义的枚举。
  • 复杂字段类型:支持列表、字典、集合、日期等类型的字段。
  • 继承和组合:可以使用继承和组合构建更复杂的模型。

Pydantic 是一个强大且易用的库,它使得数据验证、序列化和反序列化变得更加简单。通过 Pydantic,你可以快速构建并验证数据结构,自动处理类型转换,并生成易于使用的接口。

如果你正在构建 API 或者 Web 应用,Pydantic 是一个非常适合的工具,它与 FastAPI 配合使用尤其出色。通过 Pydantic,你不仅能够保证数据的正确性,还能让开发过程更加高效和流畅。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安迪小宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值