给定具有多个响应模型的 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
。如果未找到匹配项,则抛出错误。