当前位置: 首页 > 知识库问答 >
问题:

FastAPI:如何将任意属性dict映射到pydantic模型以让swagger显示细节

吕鹏
2023-03-14

我有一个 FastAPI 项目,其中一个endpoint如下所示:

@app.post(
    response=SomePydanticModel() # how to compose SomePydanticModel here???
)
def my_end_point():
    response = {
        "ZOOQ-700Z71": [
            {"product_id": "prod_001", "product_name": "Product 001", "quantity": 10},
            {"product_id": "prod_002", "product_name": "Product 002", "quantity": 20},
            {"product_id": "prod_004", "product_name": "Product 004", "quantity": 30},
        ],
        "0071-ZOGKNQ": [
            {"product_id": "prod_001", "product_name": "Product 001", "quantity": 10},
            {"product_id": "prod_003", "product_name": "Product 003", "quantity": 7},
            {"product_id": "prod_008", "product_name": "Product 008", "quantity": 2},
        ],
        "0071-Z0GKQ7": [
            {"product_id": "prod_002", "product_name": "Product 002", "quantity": 12},
            {"product_id": "prod_007", "product_name": "Product 007", "quantity": 6},
        ],
        "ZZOQ-ZXOCT9": [
            {"product_id": "prod_004", "product_name": "Product 004", "quantity": 100},
        ],
        "2007-ZCKOZR": [
            {"product_id": "prod_004", "product_name": "Product 004", "quantity": 30},
            {"product_id": "prod_005", "product_name": "Product 005", "quantity": 20},
        ],
    }

如您所见,我的响应是任意属性dict,其格式为xxxx-xxxxxx的属性是采购订单ID。我如何编写SomePydanticModel来表示我的响应?因此,我希望大摇大摆地展示我的回应。

共有1个答案

卢伟志
2023-03-14

您可以使用将 Dict 作为根类型的模型,将键作为具有正则表达式模式的约束字符串结构

例如:

from typing import Dict, List

from fastapi import FastAPI
from pydantic import BaseModel, constr

app = FastAPI()


class Product(BaseModel):
    product_id: str
    product_name: str
    quantity: int


ConStrType = constr(regex=r'^[A-Z0-9]{4}-[A-Z0-9]{6}$')
ProductDict = Dict[ConStrType, List[Product]]


class ProductModel(BaseModel):
    __root__: ProductDict



@app.post("/products", response_model=ProductModel)
def my_end_point():
    return {
        "ZOOQ-700Z71": [
            {"product_id": "prod_001", "product_name": "Product 001", "quantity": 10},
            {"product_id": "prod_002", "product_name": "Product 002", "quantity": 20},
            {"product_id": "prod_004", "product_name": "Product 004", "quantity": 30},
        ],
        "0071-ZOGKNQ": [
            {"product_id": "prod_001", "product_name": "Product 001", "quantity": 10},
            {"product_id": "prod_003", "product_name": "Product 003", "quantity": 7},
            {"product_id": "prod_008", "product_name": "Product 008", "quantity": 2},
        ],
        "0071-Z0GKQ7": [
            {"product_id": "prod_002", "product_name": "Product 002", "quantity": 12},
            {"product_id": "prod_007", "product_name": "Product 007", "quantity": 6},
        ],
        "ZZOQ-ZXOCT9": [
            {"product_id": "prod_004", "product_name": "Product 004", "quantity": 100},
        ],
        "2007-ZCKOZR": [
            {"product_id": "prod_004", "product_name": "Product 004", "quantity": 30},
            {"product_id": "prod_005", "product_name": "Product 005", "quantity": 20},
        ],
    }
 类似资料:
  • 我想创建一个FastAPIendpoint,它只接受任意发布请求正文并返回它。 如果我发送,我想得到。但我也希望能够发送并取回它。 我试过了: 但是无论我发送什么,这都会返回一个空字典。 有什么想法吗?

  • 我想在没有ORM的情况下使用FastAPI(使用asyncpg),并将select查询返回的值映射到pydantic模型。通过这种方式,使用pydantic验证返回的值,并且返回的响应的结构类似pydanti模型/模式。 我尝试寻找有关此的文档,但很难找到/不清楚。我将不胜感激任何帮助!

  • 在我的数据库表中,我有一个列,它的内容可以是Y或N(CHECK约束)。我在Java中定义了一个String属性,在我的类中定义了一个基于String的setter。此外,为了方便起见,我添加了一个带有布尔参数的setter/getter。 那么,Hibernate基于什么属性进行映射呢?方法名称?参数名称?参数类型?在setter中使用可以吗?如果我的属性的名称与表列的名称不同,这会有什么不同吗?

  • MapStrut的新成员;对象到字符串错误: [错误] /util/LicenseMapper.java:[11,23]无法映射属性" Java . lang . object license . custom fields[]。值" to " Java . lang . string license . custom fields[]。值”。考虑声明/实现一个映射方法:“Java . lang

  • 我正在使用swagger工具来记录我基于Jersey的REST API(我正在使用的swaggerui是在2014年6月下载的,我不知道这个问题是否在以后的版本中得到了解决,但由于我对其代码进行了大量定制,所以我没有选择下载最新版本,而无需再次投入大量时间进行定制)。 到目前为止,我所有的传输对象都有一级深度属性(没有嵌入的POJO)。但现在,我添加了一些返回更复杂对象(两级深度)的rest路径,

  • 问题内容: 我需要将obj 映射到一个类及其中的数组,并且它也应该具有所有子级数据。(也嵌套数组列表),我需要再次将更新的数据列表转换为 我的json字符串是 问题答案: 首先, 您需要创建要在其中映射JSON的类。 幸运的是,有一个网站,可以为你做它在这里 其次,您可以使用Google Gson库进行轻松映射 1.添加 依赖项 。 2.从您的对象到JSON。 3.从JSON到object。 有关