Skip to content

Latest commit

 

History

History
115 lines (70 loc) · 3 KB

body-fields.md

File metadata and controls

115 lines (70 loc) · 3 KB

请求体 - 字段

与在路径操作函数中使用 QueryPathBody 声明校验与元数据的方式一样,可以使用 Pydantic 的 Field 在 Pydantic 模型内部声明校验和元数据。

导入 Field

首先,从 Pydantic 中导入 Field

=== "Python 3.10+"

```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001_an_py310.py!}
```

=== "Python 3.9+"

```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001_an_py39.py!}
```

=== "Python 3.8+"

```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001_an.py!}
```

=== "Python 3.10+ non-Annotated"

!!! tip
    尽可能选择使用 `Annotated` 的版本。

```Python hl_lines="2"
{!> ../../../docs_src/body_fields/tutorial001_py310.py!}
```

=== "Python 3.8+ non-Annotated"

!!! tip
    尽可能选择使用 `Annotated` 的版本。

```Python hl_lines="4"
{!> ../../../docs_src/body_fields/tutorial001.py!}
```

!!! warning "警告"

注意,与从 `fastapi` 导入 `Query`,`Path`、`Body` 不同,要直接从 `pydantic` 导入 `Field` 。

声明模型属性

然后,使用 Field 定义模型的属性:

=== "Python 3.10+"

```Python hl_lines="11-14"
{!> ../../../docs_src/body_fields/tutorial001_an_py310.py!}
```

=== "Python 3.9+"

```Python hl_lines="11-14"
{!> ../../../docs_src/body_fields/tutorial001_an_py39.py!}
```

=== "Python 3.8+"

```Python hl_lines="12-15"
{!> ../../../docs_src/body_fields/tutorial001_an.py!}
```

=== "Python 3.10+ non-Annotated"

!!! tip
    Prefer to use the `Annotated` version if possible.

```Python hl_lines="9-12"
{!> ../../../docs_src/body_fields/tutorial001_py310.py!}
```

=== "Python 3.8+ non-Annotated"

!!! tip
    Prefer to use the `Annotated` version if possible.

```Python hl_lines="11-14"
{!> ../../../docs_src/body_fields/tutorial001.py!}
```

Field 的工作方式和 QueryPathBody 相同,参数也相同。

!!! note "技术细节"

实际上,`Query`、`Path` 都是 `Params` 的子类,而 `Params` 类又是 Pydantic 中 `FieldInfo` 的子类。

Pydantic 的 `Field` 返回也是 `FieldInfo` 的类实例。

`Body` 直接返回的也是 `FieldInfo` 的子类的对象。后文还会介绍一些 `Body` 的子类。

注意,从 `fastapi` 导入的 `Query`、`Path` 等对象实际上都是返回特殊类的函数。

!!! tip "提示"

注意,模型属性的类型、默认值及 `Field` 的代码结构与*路径操作函数*的参数相同,只不过是用 `Field` 替换了`Path`、`Query`、`Body`。

添加更多信息

FieldQueryBody 等对象里可以声明更多信息,并且 JSON Schema 中也会集成这些信息。

声明示例一章中将详细介绍添加更多信息的知识。

小结

Pydantic 的 Field 可以为模型属性声明更多校验和元数据。

传递 JSON Schema 元数据还可以使用更多关键字参数。