Код: Выделить всё
class Foo(BaseModel):
template : str
body: FooBody
class Bar(BaseModel):
template : str
body: BarBody
class Xyz(BaseModel):
template : str
body: XyzBody
@router.post("/something", status_code=status.HTTP_200_OK)
async def get_pdf(
request: Request,
request_body: Union[Foo, Bar, Xyz],
):
Код идеально работает для данных типов тела.
Однако, если отсутствует одно поле, ошибка проверки 422 приводит к появлению множества отсутствующих полей, даже если отсутствует только одно поле.
Что может быть причиной этого.
или я неправильно использую Union?
Моя цель — разрешить только упомянутую базовую модель (Foo, Bar, Xyz)
и если мой запрос обнаружил Foo и определенное поле, отсутствующее в запросе, тогда он должен показывать только это поле, а не показывать все поле в Bar, Xyz и отсутствующее в Foo
Минимально воспроизводимый пример
Код: Выделить всё
from typing import Union
from fastapi import FastAPI
app = FastAPI(debug=True)
from fastapi import APIRouter, status
from pydantic import BaseModel
class FooBody(BaseModel):
foo1: str
foo2: int
foo3: str
class Foo(BaseModel):
temp: str
body: FooBody
class BarBody(BaseModel):
bar1: str
bar2: int
bar3: str
class Bar(BaseModel):
temp: str
body: BarBody
class XyzBody(BaseModel):
xyz1: str
xyz2: int
xyz3: str
class Xyz(BaseModel):
temp: str
body: XyzBody
@app.get("/type", status_code=status.HTTP_200_OK)
def health(response_body: Union[Foo, Bar, Xyz]):
return response_body
Код: Выделить всё
{
"temp": "xyz",
"body": {
"foo1": "ok",
"foo2": 1,
"foo3": "2"
}
}
Код: Выделить всё
{
"detail": [
{
"loc": [
"body",
"body",
"foo3"
],
"msg": "field required",
"type": "value_error.missing"
},
{
"loc": [
"body",
"body",
"bar1"
],
"msg": "field required",
"type": "value_error.missing"
},
{
"loc": [
"body",
"body",
"bar2"
],
"msg": "field required",
"type": "value_error.missing"
},
{
"loc": [
"body",
"body",
"bar3"
],
"msg": "field required",
"type": "value_error.missing"
},
{
"loc": [
"body",
"body",
"xyz1"
],
"msg": "field required",
"type": "value_error.missing"
},
{
"loc": [
"body",
"body",
"xyz2"
],
"msg": "field required",
"type": "value_error.missing"
},
{
"loc": [
"body",
"body",
"xyz3"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}
Я использую Union неправильно?
Что я Необходимость заключается в том, что он должен принимать тело только тех классов, которые я добавляю. Если он обнаруживает свой класс Foo, тогда он должен проверять только проверки в классе Foo, а не все это.
Подробнее здесь: https://stackoverflow.com/questions/746 ... -entity-fa