如何让 Pydantic 的 BaseModel 在 fastapi 应用中接受一些特殊情况的输入类型



我有一个fastapi应用程序,它接收"application/json";在其它输入类型中;application/json";。我有一个输入验证器,它对pydantic的BaseModel进行了子类化,我想让它接受一些我确实接收到的输入,而不是在它们上生成fastapi.exceptions.RequestValidationError

一些可接受的输入(List[List[float]](:

  1. {"input_json":[[1.0, 2.0, 3.0, 4.0]]}
  2. {"input_json":[[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0]]}

我想让它接受以下输入情况:

  1. {"input_json":[[1.0, 2.0, .0, 4.]]}(小数点后没有数字,numpy数组和python列表通过在句点后填充0来接受此类输入,但pydantic抛出验证错误。(
  2. {"input_json":[1.0, 2.0, 3.0, 4.0]}(没有列表列表,只是一个列表。我将在内部处理numpy.my_array.reshape(-1, 4)的形状,但我希望pydantic不生成RequestValidationError,并将输入发送到我的fastapi端点。(
  3. {"input_json":[[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0],]}(第二个嵌套列表末尾的逗号。numpy和python列表都接受这样的输入,但pydantic不接受。(

以下是我的validaton类的编写方式:

from pydantic import BaseModel, validator
class InputResponse(BaseModel):
input_json: List[List[float]]
@validator("input_json")
def check_dimensionality(cls, list_of_lists):
for nested_list in list_of_lists:
if len(nested_list) != 4:
raise ValueError(incomplete_msg)
return list_of_lists

为了能够接受所有这些输入案例,我做了哪些更改?

为此,您可以定义TypeVar或使用联合类型。在看起来像的代码中

from typing import TypeVar, Union
T = TypeVar("T", list[list[float]], list[float])
# Option with TypeVar
class InputResponse(BaseModel):
input_json: T
# Option with Union type
class InputResponse(BaseModel):
input_json: Union[list[list[float]], list[float]]

关于小数点后缺失的零,我没有看到任何问题。

相关内容

  • 没有找到相关文章

最新更新