如何使用 FastAPI 记录 OpenAPI/Swagger 中的默认 None/null?

2025-02-18 09:23:00
admin
原创
52
摘要:问题描述:使用 ORM,我想要发出一个 POST 请求,让一些字段具有一个null值,该值将在数据库中转换为那里指定的默认值。问题是 OpenAPI(Swagger)文档忽略了默认值,并且仍然默认None提示。UUIDfrom fastapi import FastAPI from pydantic impo...

问题描述:

使用 ORM,我想要发出一个 POST 请求,让一些字段具有一个null值,该值将在数据库中转换为那里指定的默认值。

问题是 OpenAPI(Swagger)文档忽略了默认值,并且仍然默认None提示。UUID

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
from uuid import UUID
import uvicorn


class Table(BaseModel):
    # ID: Optional[UUID]      # the docs show a example UUID, ok
    ID: Optional[UUID] = None # the docs still shows a uuid, when it should show a null or valid None value.

app = FastAPI()  
    
@app.post("/table/", response_model=Table)
def create_table(table: Table):
    # here we call to sqlalchey orm etc.
    return 'nothing important, the important thing is in the docs'
    
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

在文档中的 OpenAPI 模式示例(请求正文)中,我们发现:

{
 "ID": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}

这不行,因为我指定的默认值是None,所以我期望的是这个:

{
 "ID": null, # null is the equivalent of None here
}

它将把一个传递nullID并最终在数据库中解析为默认值(即新生成的UUID)。


解决方案 1:

声明Optional参数时,用户不应null在用或(在 Python 中)指定的请求中包含这些参数None,以便None默认情况下,此类参数的值将为None,除非用户在发送请求时指定其他值。

因此,您所要做的就是使用和example为 Pydantic 模型声明一个自定义,如文档中所述,如下所示。以下示例将在 OpenAPI(Swagger UI)中创建一个空的(即)请求主体,可以成功提交(因为这是模型的唯一属性并且是可选的)。Config`schema_extra{}ID`

class Table(BaseModel):
    ID: Optional[UUID] = None
    
    class Config:
        schema_extra = {
            "example": {
            }
        }

@app.post("/table/", response_model=Table)
def create_table(table: Table):
    return table

如果Table模型包含一些其他必需的属性,您可以example为这些属性添加值,如下所示:

class Table(BaseModel):
    ID: Optional[UUID] = None
    some_attr: str
    
    class Config:
        schema_extra = {
            "example": {
                "some_attr": "Foo"
            }
        }

如果您想要保留除属性之外其余属性的自动生成示例,则可以使用以下命令从生成的架构中的模型属性中删除(受架构定制的启发):IDID

class Table(BaseModel):
    ID: Optional[UUID] = None
    some_attr: str
    some_attr2: float
    some_attr3: bool
    
    class Config:
        @staticmethod
        def schema_extra(schema: Dict[str, Any], model: Type['Table']) -> None:
            del schema.get('properties')['ID']

此外,如果您想example为某些属性添加自定义功能,您可以使用Field()(如此处所述);例如,some_attr: str = Field(example="Foo")

另一个可能的解决方案是修改生成的 OpenAPI 模式,如此答案的解决方案 3 中所述。不过,上述解决方案可能更适合这种情况。

笔记

ID: Optional[UUID] = None与 相同ID: UUID = None。如之前在 FastAPI 网站中所述(另请参阅此答案):

FastAPI 不使用Optional Optional[str],但它可以让你编辑器为你提供更好的支持并检测错误。

从那时起,FastAPI对其文档进行了如下修改:

UnionUnion[str, None]将允许你的编辑器为你提供更好的支持并检测错误。

因此,与 和 相同ID: Union[UUID, None] = None在Python 3.10+,还可以使用(参见此处)。ID: Optional[UUID] = None`ID: UUID = None`ID: UUID| None = None

根据FastAPI 文档(请参阅Info所提供链接中的部分):

请记住,使参数可选的最重要的部分是:

= None

或:

= Query(default=None)

因为它将使用它None作为默认值,这样就使得该参数不再是必需的。

Union[str, None]部分允许您的编辑器提供更好的支持,但这并不是告诉 FastAPI 此参数不是必需的

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用