Проверки, показывающие неверные данные в ответе на 422 необрабатываемый объект (FastAPI, Pydantic).Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проверки, показывающие неверные данные в ответе на 422 необрабатываемый объект (FastAPI, Pydantic).

Сообщение Anonymous »

Код: Выделить всё

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],
):

В приведенном выше фрагменте кода мое тело может быть трех типов (любого) с использованием Union.
Код идеально работает для данных типов тела.
Однако, если отсутствует одно поле, ошибка проверки 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"
}
}
Он работает так, как ожидалось, но если я пропущу один параметр, скажем, foo3 в теле запроса, я не получу ошибку проверки, сообщающую, что foo3 отсутствует, вместо этого я получаю

Код: Выделить всё

{
"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.
Я использую Union неправильно?
Что я Необходимость заключается в том, что он должен принимать тело только тех классов, которые я добавляю. Если он обнаруживает свой класс Foo, тогда он должен проверять только проверки в классе Foo, а не все это.

Подробнее здесь: https://stackoverflow.com/questions/746 ... -entity-fa
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»