> ## Documentation Index
> Fetch the complete documentation index at: https://docs.squarecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# 如何使用 pydantic 验证数据

> 了解如何使用 pydantic 验证数据。

## 简介

* 本文将引导你完成使用 pydantic 进行数据验证的过程。Pydantic 是一个用 Rust 构建的 Python 库。
* 在开始之前，请确保你的环境中已安装 Python 和 Pydantic 库。请查看下面的 pydantic 安装命令。

```bash theme={null}
pip install pydantic
```

## 创建模型

* 首先，我们需要导入并让我们的类继承自 `pydantic.BaseModel` 以开始验证。在我们的示例中，我们将创建一个名为
  `Person` 的类，它将包含姓名、年龄和一个电子邮件。

```python theme={null}
from pydantic import BaseModel

class Person(BaseModel):
    name: str
    age: int
    email: str
```

* 有了这个类，当我们实例化它时，pydantic 将验证参数 `name` 和 `email` 是否为字符串，以及 `age` 是否为整数。

### 使用模型

* 现在我们已经创建了它，接下来我们将实例化该类。我们将创建一个包含数据的字典，并将其解包传入我们的类。

```python theme={null}
data = {
    "name": "John",
    "age": 19,
    "email": "john@gmail.com"
}
person = Person(**data)
```

* 上面的示例不会引发任何错误，因为所有**参数**的类型都正确。现在我们将构造一份错误的数据，以确认我们的验证是否
  生效。

```python theme={null}
data = {
    "name": "John",
    "age": "19",
    "email": "john@gmail.com"
}
person = Person(**data)
```

* 在上面的示例中，它将引发 `ValidationError` 错误，因为 `age` 需要是**整数**，不能以**字符串**形式提供。

## 创建 dataclass

* 你也可以使用 pydantic 创建 **dataclass**，它与标准的 Python **dataclass** 类似，但会像 BaseModel 一样进行验证。

```python theme={null}
from pydantic import dataclass

@dataclass
class Person:
    name: str
    age: int
    email: str
```

* 如果我们向 `age` 发送一个 `string`，它将被转换为 `int`。

<Info>
  Pydantic 支持递归验证，这意味着在验证嵌套模型时，它也会验证内部的
  模型。

  如果某个类包含一个 `Person` 的列表 `people: list[Person]`，它将检查列表中的每一项并将其转换为 `Person`。
</Info>

## 附加内容

* Pydantic 有一些附加功能，例如**电子邮件**验证和一个后备的**时区**包。要安装它们，你需要运行以下命令：

```bash theme={null}
pip install pydantic[email]
```

```bash theme={null}
pip install pydantic[timezone]
```

* 你可以通过运行以下命令将两者一起安装。

```bash theme={null}
pip install pydantic[email,timezone]
```

* Pydantic\[email] 提供了一个用于处理电子邮件的类，对其进行规范化并验证 `user@domain.tld` 格式。为此，pydantic 提供了 `EmailStr` 类来完成此验证。

```python theme={null}
from pydantic import dataclass, EmailStr

@dataclass
class Person:
    name: str
    age: int
    email: EmailStr
```

## 你喜欢这篇文章吗？

* 我们精心创作了这些内容，只为提供尽可能好的帮助。
  如果这篇文章对你有任何帮助，请支持我们的工作！留下你的评价！这能帮助我们了解什么对你最重要。

<CardGroup cols={2}>
  <Card title="Google Reviews" icon="google" href="https://g.page/r/CYZenpQcDgTzEAI/review">
    在 Google Reviews 上留下你的评价。
  </Card>

  <Card title="Trustpilot" icon="star" href="https://www.trustpilot.com/review/squarecloud.app">
    在 Trustpilot 上留下你的评价。
  </Card>
</CardGroup>
