大洋洲模型动态场数据类型

问题描述

我想根据特定条件动态分配字段数据类型。下面是我的模型:

class Connection(BaseModel):
    name: str
    # type can be GCS or ORACLE
    type: str
    details: GCSDetails/OracleDetails

class GCSDetails(BaseModel):
    bucket: str
    folderName: str

class OracleDetails(BaseModel):
    host: str
    port: int
    user: str

那么,基于“类型”,即GCS或ORACLE,我如何在验证过程中动态更改“详细信息”数据类型?

解决方法

Pydantic可以通过type类型because

来执行此操作,而无需使用其他Union字段

pydantic 将尝试“匹配”在Union下定义的任何类型,并将使用第一个匹配的类型。

from typing import Union

from pydantic import BaseModel


class GCSDetails(BaseModel):
    bucket: str
    folderName: str


class OracleDetails(BaseModel):
    host: str
    port: int
    user: str


class Connection(BaseModel):
    name: str
    # type can be GCS or ORACLE
    type: str
    details: Union[GCSDetails,OracleDetails]


test_gcs = {"name": "","type": "GCS","details": {"bucket": "","folderName": ""}}
test_oracle = {"name": "","type": "ORACLE","details": {"host": "","port": 15,"user": ""}}

print(Connection(**test_gcs))
print(Connection(**test_oracle))

输出:

name='' type='GCS' details=GCSDetails(bucket='',folderName='')
name='' type='ORACLE' details=OracleDetails(host='',port=15,user='')