首页 > 解决方案 > pydantic 模型动态字段数据类型

问题描述

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

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,如何在验证期间动态更改“详细信息”数据类型?

标签: pythonparsingpydantic

解决方案


Pydantic可以在不使用类型的附加type字段的 情况下做到这一点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='')

推荐阅读