如何在使用FastAPI的Swagger UI自动文档中基于BaseModel添加下拉菜单?

4

我有以下这个类:

class Quiz(BaseModel):
    question: str
    subject: str
    choice: str = Query(choices=('eu', 'us', 'cn', 'ru'))
         

我可以根据这个类来呈现表单,就像这样
@api.post("/postdata")
def post_data(form_data: Quiz = Depends()):
    return form_data

如何为选择字段显示下拉列表?

你使用的前端框架是什么? - puf
1
我正在使用 OpenAPI (/docs)。 - aba2s
1个回答

5

选项1

使用字面值。Python 3.8的标准库中新增了Literal类型(在Python 3.8之前需要typing-extensions包支持),并且Pydantic支持该类型。例如:

from fastapi import FastAPI, Depends
from pydantic import BaseModel
from typing import Literal

app = FastAPI()
    
class Quiz(BaseModel):
    question: str
    subject: str
    choice: Literal['eu', 'us', 'cn', 'ru'] = 'us'

@app.post('/submit')
def post_data(data: Quiz = Depends()):
    return data

选项 2

使用 枚举(还可参考 Python 的 enum 模块,以及 FastAPI 对预定义值的文档)。通过让你的 Enum 子类继承自 str,API 文档将能够知道这些值必须是字符串类型,并能够正确地呈现。例如:

from fastapi import FastAPI, Depends
from pydantic import BaseModel
from enum import Enum

app = FastAPI()

class Country(str, Enum):
    eu = 'eu'
    us = 'us'
    cn = 'cn'
    ru = 'ru'
    
class Quiz(BaseModel):
    question: str
    subject: str
    choice: Country = Country.us
    
@app.post('/submit')
def post_data(data: Quiz = Depends()):
    return data

但是通过使用data: Quiz = Depends()这种方式,所有属性都变成了查询参数,而没有Depends()它们就变成了一个没有下拉菜单的请求体在swagger中。那么有没有办法让choice属性在请求体中有一个下拉菜单呢?或者如何让choice有一个查询下拉菜单,而其他属性有一个请求体呢?我想我应该有两个pydantic模式,对吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接