Я знаю концепцию из Typescript под названием Дискриминационные союзы. Это то, что вы помещаете 2 структуры (классы и т. Д.), И тип определяется в зависимости от значений структуры. Я пытаюсь добиться того же в FastAPI с проверкой Pydantic. Есть две разные полезные нагрузки запроса, которые я могу получить. То ли это, то ли зависит от переменной 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()