【问题标题】:pydantic model dynamic field data typepydantic 模型动态字段数据类型
【发布时间】:2021-01-29 14:18:26
【问题描述】:

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

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

【问题讨论】:

    标签: python parsing pydantic


    【解决方案1】:

    Pydantic 可以通过Union 类型because 使用额外的type 字段来执行此操作

    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='')
    

    【讨论】:

    • 你的答案是绝对正确的。我想补充一点。我想如果他想添加验证数据是否实际上应该属于哪种类型,则需要 type 字段。我想将经过清理或验证的数据传递给 Union 绝不是一个好的选择。
    • 有没有办法将每个XXXDetails 限制为仅type 的特定值?
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2021-10-29
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2011-02-05
    • 2022-07-02
    相关资源
    最近更新 更多