文章目录
-
-
- [1. `response_model`](#1.
response_model
) - [2. `response_model_include` 和 `response_model_exclude`](#2.
response_model_include
和response_model_exclude
) - [3. `response_model_by_alias`](#3.
response_model_by_alias
) - [4. `response_model_skip_defaults`](#4.
response_model_skip_defaults
) - [5. `response_model_exclude_unset`](#5.
response_model_exclude_unset
) - [6. `response_model_exclude_none`](#6.
response_model_exclude_none
)
- [1. `response_model`](#1.
-
在 FastAPI 中,可以使用 Pydantic 模型来定义响应数据的结构。这些模型可以用于自动生成 JSON Schema,并用于请求和响应的数据验证。以下是一些与响应模型相关的参数:
1. response_model
指定Pydantic 模型序列化和验证响应数据。如果响应数据与模型不匹配,FastAPI 将自动报错。
python
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: str):
return {
"name": "Foo",
"description": "A very nice Item",
"price": 35.4,
"tax": 3.2,
}
2. response_model_include
和 response_model_exclude
在序列化响应数据时包含或排除某些字段。两个参数都可以接收一个字段名列表,或者一个字段名集合。
python
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.get("/items/{item_id}", response_model=Item, response_model_exclude={"tax"})
async def read_item(item_id: str):
return {
"name": "Foo",
"description": "A very nice Item",
"price": 35.4,
"tax": 3.2,
}
在这个例子中,tax
字段将不会包含在响应中。
3. response_model_by_alias
控制是否使用字段的别名进行序列化。默认情况下,FastAPI 使用字段的名称进行序列化,但可以通过定义别名来改变这个行为。
python
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
name: str = Field(alias="itemName")
description: str = None
price: float
tax: float = None
class Config:
allow_population_by_field_name = True
@app.get("/items/{item_id}", response_model=Item, response_model_by_alias=False)
async def read_item(item_id: str):
return {
"itemName": "Foo",
"description": "A very nice Item",
"price": 35.4,
"tax": 3.2,
}
在这个例子中,即使 response_model_by_alias
设置为 False
,响应仍然会使用 itemName
而不是 name
作为字段名。
4. response_model_skip_defaults
控制是否在响应中包含默认值。默认情况下,FastAPI 会包含所有字段的默认值,但可以通过设置参数为 True
来改变这个行为。
python
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.get("/items/{item_id}", response_model=Item, response_model_skip_defaults=True)
async def read_item(item_id: str):
return {
"name": "Foo",
"description": "A very nice Item",
"price": 35.4,
"tax": 3.2,
}
在这个例子中,如果 tax
字段的值是 None
,它将不会包含在响应中。
5. response_model_exclude_unset
控制是否在响应中包含未设置的字段。默认情况下,FastAPI 会包含所有字段,包括那些没有在响应数据中设置的字段,但可以通过设置这个参数为 True
来改变这个行为。
python
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.get("/items/{item_id}", response_model=Item, response_model_exclude_unset=True)
async def read_item(item_id: str):
return {
"name": "Foo",
"price": 35.4,
}
在这个例子中,只有 name
和 price
字段会包含在响应中,即使 description
和 tax
字段没有在响应数据中设置。
6. response_model_exclude_none
控制是否在响应中包含值为 None
的字段。默认情况下,FastAPI 会包含所有字段,包括那些值为 None
的字段,但可以通过设置这个参数为 True
来改变这个行为。
python
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.get("/items/{item_id}", response_model=Item, response_model_exclude_none=True)
async def read_item(item_id: str):
return {
"name": "Foo",
"description": None,
"price": 35.4,
"tax": None,
}
在这个例子中,只有 name
和 price
字段会包含在响应中,即使 description
和 tax
字段的值是 None
。