为响应模式 fastapi 构建 Pydantic 模式

constructing Pydantic schema for response modal fastapi

我有这样的数据响应

{
  "k9KNg_id": {
    "card_name": "item1",
    "price_updated_date": "2022-04-07T19:30:25.78Z",
    "card_img_id": "https://testingimg",
    "set_name": "some testing set",
    "set_tag": "mm3",
    "rarity": "rare",
    "price_normal": 32.99,
    "price_foil": 54.99
  },
  "EWrZ5_id": {
    "item_name": "item2",
    "price_updated_date": "2022-04-07T08:05:52.385Z",
    "item_name_img_id": "https://testingimg",
    "set_name": "testing set",
    "set_tag": "exp",
    "rarity": "super rare",
    "price_normal": null,
    "price_foil": 379.99
  },

所以现在我正在尝试用 fastapi 和基本模型模式编写这个 api return。我应该如何编写架构?因为我有我的商品 ID,然后是我的商品详细信息。

 item_dict.update({
            "item_name": abc["item"]["name"],
            "price_updated_date": ed["prices"]["lastUpdatedAtUtc"],
            "item_img_id": item_img_url,
            "set_name": ed["name"],
            "set_tag": ed["abbreviation"],
            "rarity": ed["rarity"],
            "price_normal": normal_price,
            "price_foil": foil_price
        })
        data_return[ed["card_id"]] = ckd_dict
    return data_return

在我的 api 呼叫中,我只是发送了一个非常简单的快速 api 呼叫

@router.get("/{item_name}")
async def search(item_name):
    item = get_item(item_url, item_url_type, item_name)
    return item 

我想为我的快速 api 到 return 数据创建一个 response_model 但我不确定如何使用这种数据结构构建我的模式

首先将列表(字典)响应与卡片结构分开:

class Card(BaseModel):
    card_name: str
    price_updated_date: datetime.datetime,
    card_img_id: str
    set_name: str
    set_tag: str
    rarity: str
    price_normal: float  # or maybe better, decimal.Decimal  - depends on your use case.
    price_foil: float  # same

然后您可以直接在 search 装饰器中使用它,并说您 return 一本纸牌字典:

@router.get("/{item_name}", response_model=Dict[str, Card])
async def search(item_name):
    pass

但是,您应该可以使用 __root__ 来定义 root level dictionary response:

class CardListResponse(BaseModel):
    __root__: Dict[str, Card]


@router.get("/{item_name}", response_model=CardListResponse)
async def search(item_name):
    pass