FastAPI - 响应模型参数

文章目录

      • [1. `response_model`](#1. response_model)
      • [2. `response_model_include` 和 `response_model_exclude`](#2. response_model_includeresponse_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)

在 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_includeresponse_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,
    }

在这个例子中,只有 nameprice 字段会包含在响应中,即使 descriptiontax 字段没有在响应数据中设置。

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,
    }

在这个例子中,只有 nameprice 字段会包含在响应中,即使 descriptiontax 字段的值是 None


相关推荐
kyriewen5 小时前
别再 console.log 了:5 个 Chrome DevTools 调试技巧,用过就回不去了
前端·javascript·面试
IT_陈寒7 小时前
Python搞不定字符串编码?这破玩意坑我两小时!
前端·人工智能·后端
DigitalOcean8 小时前
Laravel 开发者已在 DigitalOcean 上开通超过 10 万台服务器
前端·laravel
星始流年8 小时前
从 Tool 到 Skill——基于 LangChain 的服务端Skill实现
前端·langchain·agent
李惟8 小时前
开源本地通信库,纯客户端 RPC,像聊天一样通信
前端
YAwu118 小时前
深入解析 React 炫彩鼠标跟随标题组件:从坐标定位到动画性能
前端·react.js
GuWenyue8 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
OpenTiny社区9 小时前
🎨 看完 GenUI SDK 源码我悟了!
前端·vue.js·github
叁两9 小时前
前端转型AI Agent该如何学习?(前置篇)
前端·人工智能·node.js
何时梦醒9 小时前
深入理解递归与快速排序 —— 从基础入门到手写实现
前端·javascript