【发布时间】:2020-06-23 07:49:34
【问题描述】:
我正在尝试使用Literal 与 Pydantic 创建一个有区别的联合。
有关于 Job 资源的事件,我想通过event_name 来区分它们。对于JobPublishedEvents,我想确保存在一些extra_field。
class GenericJobEvent(BaseModel):
event_name: str
id: int
class JobPublishedEvent(GenericJobEvent):
event_name: Literal['job.published']
extra_field: str
class Wrapper(BaseModel):
wrapped: Union[JobPublishedEvent, GenericJobEvent]
print(type(Wrapper(wrapped={'event_name': 'some.event', 'id': 1}).wrapped)) # GenericJobEvent
print(type(Wrapper(wrapped={'event_name': 'job.published', 'id': 1, 'extra_field': 'extra'}).wrapped)) # JobPublishedEvent
print(type(Wrapper(wrapped={'event_name': 'job.published', 'id': 1}).wrapped)) # GenericJobEvent
前两种情况的行为符合预期,对于第三种情况,我想要一个验证错误,因为文字匹配,但架构不满足。不过,我明白为什么回退到 GenericJobEvent 是有效的。
有人知道如何实现这一目标吗?
【问题讨论】:
标签: python discriminated-union fastapi pydantic