我从Typescript中知道一个概念,叫做有区别的联合。这是一个放置2个结构(类等)的地方,类型取决于结构的值。我正试图通过Pydantic验证在FastAPI中实现类似的功能。我可以接收两种不同的请求有效负载。它是一个还是另一个取决于accountType
变量。如果是creative
,则应通过RegistrationPayloadCreative
进行验证,如果是brand
,则应通过RegistrationPayloadBrand
进行验证。我如何做到这一点?找不到其他解决方案
问题是它要么返回
unexpected value; permitted: 'creative' (type=value_error.const; given=brand; permitted=('creative',))
或者根本不起作用
class RegistrationPayloadBase(BaseModel):
first_name: str
last_name: str
email: str
password: str
class RegistrationPayloadCreative(RegistrationPayloadBase):
accountType: Literal['creative']
class RegistrationPayloadBrand(RegistrationPayloadBase):
company: str
phone: str
vat: str
accountType: Literal['brand']
class A(BaseModel):
b: Union[RegistrationPayloadBrand, RegistrationPayloadCreative]
def main():
A(b={'first_name': 'sdf', 'last_name': 'sdf', 'email': 'sdf', 'password': 'sdfds', 'accountType': 'brand'})
if __name__ == '__main__':
main()
该错误消息有点误导,因为问题在于公司/电话/增值税字段在RegistrationPayloadBrand中是强制性的
因此:
或者使其可选(如果有效负载不一定包含这些字段)
这将解决问题
您应该使用
__root__
和parse_obj
信用证:https://github.com/tiangolo/fastapi/issues/2279#issuecomment-787517707
相关问题 更多 >
编程相关推荐