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
相关产品推荐
相关产品推荐

