簡體   English   中英

嵌套 Pydantic Model 使用 FastAPI 返回錯誤:需要字段(type=value_error.missing)

[英]Nested Pydantic Model return error with FastAPI : field required (type=value_error.missing)

我在使用FastAPIPydantic 時遇到了問題。 我嘗試根據我的 Pydantic model 返回記錄列表。

這是 SQLAlchemy 元數據:


from sqlalchemy import MetaData, Table, Column, Integer, JSON, Boolean
from sqlalchemy.sql import expression

metadata = MetaData()

CustomLayers = Table(
    "custom_layers",
    metadata,
    Column("id", Integer, primary_key=True),
    Column("data", JSON),
    Column("is_public", Boolean, default=expression.false()),
    Column("user_id", Integer),
)

這是“對應的”pydantic model:

from geojson_pydantic.features import FeatureCollection
from pydantic import BaseModel

class CustomLayerResponse(BaseModel):
    is_public: bool
    data: FeatureCollection
    user_id: int
    id: int

    class Config:
        orm_mode = True

這是我的路線:


@router.get("/", response_model=List[CustomLayerResponse], status_code=status.HTTP_200_OK)
async def retrieve_by_user(user_id: int):
    layer_records = await customlayers_repository.retrieve_by_user_id(user_id)
    return layer_records

這是使用數據庫庫(基於 SQL Alchemy)的檢索操作


async def retrieve_by_user_id(user_id: int):
    query = CustomLayersTable.select().where(user_id == CustomLayersTable.c.user_id)
    return await database.fetch_all(query=query)

但是當我運行它時,我從 pydantic 得到了一堆ValidationError說:

response -> 7 -> id
  field required (type=value_error.missing)
response -> 7 -> user_id
  field required (type=value_error.missing)
response -> 7 -> is_public
  field required (type=value_error.missing)
response -> 7 -> data
  field required (type=value_error.missing)

但真正奇怪的是,如果我遍歷 ORM 返回的數據庫記錄並以這種方式手動創建 pydantic 模式的實例:


@router.get("/", response_model=List[CustomLayerResponse], status_code=status.HTTP_200_OK)
async def retrieve_by_user(user_id: int):
    layer_records = await customlayers_repository.retrieve_by_user_id(user_id)
    response = []
    for l in layer_records:
        manual_instance = CustomLayerResponse(data=FeatureCollection.parse_raw(l.get("data")),
                                user_id=l.get("user_id"),
                                id=l.get("id"),
                                is_public=l.get("is_public"))
        response.append(manual_instance)
    return response

然后一切都按預期工作,我得到了CustomLayerResponse列表作為響應。

所以我想知道來自 pydantic model 的“自動”驗證可能是什么問題(由 FastAPI 提供的response_model參數提供的,我在這里設置為List[CustomLayerResponse] )?

您的數據字段應使用擴展 FeatureCollection 和 BaseModel 的 class 以便您也可以將其 Config 子類字段 orm_true 設置為 true。

我還沒有使用 FeatureCollection 對其進行測試,但類似的事情發生在我身上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM