将 List[Union[...]] 与 FastApi (Pydantic) 结合使用时,评估模型列表中的可选字段

时间:2021-06-29 17:35:00

标签: python fastapi pydantic

给定具有多个响应模型的 FastAPI 端点,我希望能够根据所有所述模型的可选字段(而不是仅必填字段,这是默认值)对其进行评估。

示例代码:

<div class="wrap">
  <div class="A">
    <div class="A1">
      <div>A1</div>
      <div>A1</div>
    </div>
    <div class="A2">
      <div>A2</div>
      <div>A2</div>
      <div>A2</div>
      <div>A2</div>
      <div>A2</div>
      <div>A2</div>
      <div>A2</div>
      <div>A2</div>
      <div>A2</div>
      <div>A2</div>
      <div>A2</div>
      <div>A2</div>
      <div>A2</div>
    </div>
  </div>
  <div class="B">
    <div class="B1">
      <div>B1</div>
      <div>B1</div>
     </div>
   </div>
</div>

如上所示,响应模型将仅根据必填字段评估我的模型的并集。

一个快速的肮脏伎俩:
我能够通过在 OOP 继承的联合中组合两个模型来解决:

class A:
    required_field
    optional_field_A

class B:
    required_field
    optional_field_B

response_model = List[Union[A, B]]

# Given the following sample response data
raw_response_data = [
    {'required_field': 'foo_A', 'optional_field_A': 'bar_A'},
    {'required_field': 'foo_B', 'optional_field_B': 'bar_B'}
]

# Based on `response_model`, raw data will be translated to the following:
translated_data = [
    {'required_field': 'foo_A', 'optional_field_A': 'bar_A'},
    {'required_field': 'foo_B'}
]

我对这个解决方案的问题是它有点误导,因为 API 客户端无法确定验证他们的数据来自哪个模型。 (是A?还是B?)

所需的解决方案:
我想 Pydantic 中有一个选项可以禁止在模型上设置“错误字段”,而不会破坏联合操作。换句话说,评估模型class AB(A, B): """A synthetic union between A and B""" pass # This solves my output schema response_model = List[AB] ,如果传递了错误的字段,评估模型A。如果未找到匹配项,则抛出错误。

0 个答案:

没有答案