You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI:如何忽略传入函数的可选参数中的None值?

问题:FastAPI接口如何忽略可选参数的None值

我正在开发用于在目录中创建数据库的FastAPI接口,创建数据库的Python函数包含必填参数(如CatalogId)与可选参数(如Description、LocationUri、Parameters),并定义了如下Pydantic模型:

class createGlueDatabaseDatabaseInput(BaseModel):
    Name: str
    Description: Optional[str] = None
    LocationUri: Optional[str] = None
    Parameters: Optional[dict] = None

    class Config:
        orm_mode =  True
class createGlueDatabase(BaseModel):
    CatalogId: str
    DB_input: createGlueDatabaseDatabaseInput

    class Config:
        orm_mode =  True

当在Swagger中不提供可选参数时,它们会以None值传入函数,导致执行失败。尝试给路由函数添加response_model_exclude_none=True、将非CatalogId参数设为可选均无效,请问如何忽略传入的None值?


解决方案

方法1:序列化时用exclude_none=True过滤None值

在将Pydantic模型数据传递给数据库创建函数前,调用模型的dict(exclude_none=True)方法,自动移除所有值为None的键值对。

示例代码:

from fastapi import FastAPI
from pydantic import BaseModel, Optional

app = FastAPI()

# 你的Pydantic模型
class createGlueDatabaseDatabaseInput(BaseModel):
    Name: str
    Description: Optional[str] = None
    LocationUri: Optional[str] = None
    Parameters: Optional[dict] = None

    class Config:
        orm_mode = True

class createGlueDatabase(BaseModel):
    CatalogId: str
    DB_input: createGlueDatabaseDatabaseInput

    class Config:
        orm_mode = True

# 模拟数据库创建函数(实际替换为你的业务逻辑)
def create_glue_database(catalog_id: str, **db_params):
    # 这里只会收到非None的参数
    print(f"执行创建,CatalogId: {catalog_id}")
    print(f"数据库参数: {db_params}")

@app.post("/create-glue-db")
async def handle_create_db(request: createGlueDatabase):
    # 转换模型为字典并排除None值
    filtered_db_input = request.DB_input.dict(exclude_none=True)
    # 调用创建函数,传入必填的CatalogId和过滤后的参数
    create_glue_database(request.CatalogId, **filtered_db_input)
    return {"status": "success", "msg": "数据库创建请求已处理"}

方法2:在模型全局配置默认排除None值

修改Pydantic模型的Config类,添加exclude_none=True,这样每次调用dict()方法时都会自动排除None值,无需每次手动指定参数。

修改后的模型:

class createGlueDatabaseDatabaseInput(BaseModel):
    Name: str
    Description: Optional[str] = None
    LocationUri: Optional[str] = None
    Parameters: Optional[dict] = None

    class Config:
        orm_mode = True
        exclude_none = True  # 添加这一行,全局生效

class createGlueDatabase(BaseModel):
    CatalogId: str
    DB_input: createGlueDatabaseDatabaseInput

    class Config:
        orm_mode = True

之后在路由中直接调用request.DB_input.dict()就会自动过滤掉None值。

方法3:手动过滤字典中的None值

如果需要更灵活的控制(比如只排除特定字段的None值),可以手动遍历字典,移除值为None的键:

@app.post("/create-glue-db")
async def handle_create_db(request: createGlueDatabase):
    db_input_raw = request.DB_input.dict()
    # 手动过滤,只保留非None的键值对
    filtered_params = {key: value for key, value in db_input_raw.items() if value is not None}
    create_glue_database(request.CatalogId, **filtered_params)
    return {"status": "success"}

内容的提问来源于stack exchange,提问作者cluselesscoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:01:04