【问题标题】:Creating a Pydantic model dynamically from a Python dataclass从 Python 数据类动态创建 Pydantic 模型
【发布时间】:2021-01-25 15:57:37
【问题描述】:

我想从一个数据类动态创建一个 Pydantic 模型,类似于从一个数据类动态创建一个棉花糖模式,如在 marshmallow-dataclass 或 https://stevenloria.com/dynamic-schemas-in-marshmallow/ 中。是否已经有一个库或简单的方法可以做到这一点?

一些背景知识——我更喜欢在我的业务逻辑中使用数据类,而不是直接使用 Pydantic 模型。我仅在我的 FastAPI 应用程序中使用 Pydantic 模型对带有驼峰式字段的数据进行序列化/反序列化。但是,我发现自己基本上是在复制效率不高的数据类定义。

示例输入:

from typing import List

from dataclasses import dataclass


@dataclass
class Item:
    id: int = None
    stuff: str = None
    height: float = None


@dataclass
class Bag:
    id: int = None
    name: str = None
    things: List[Item] = None


@dataclass
class Basket:
    id: int = None
    recipient: str = None
    bags: List[Bag] = None
    best_item: Item = None

期望的输出:

from typing import List

from pydantic.main import BaseModel


def camel_case_converter(value: str):
    parts = value.lower().split('_')
    return parts[0] + ''.join(i.title() for i in parts[1:])


class CamelBaseModel(BaseModel):
    class Config:
        alias_generator = camel_case_converter


class Item(CamelBaseModel):
    id: int = None
    stuff: str = None
    height: float = None


class Bag(CamelBaseModel):
    id: int = None
    name: str = None
    things: List[Item] = None


class Basket(CamelBaseModel):
    id: int = None
    recipient: str = None
    bags: List[Bag] = None
    best_item: Item = None

【问题讨论】:

    标签: python pydantic


    【解决方案1】:

    也许是这样的? (来自https://github.com/samuelcolvin/pydantic/issues/1967#issuecomment-742698281

    from typing import Type
    
    from pydantic import BaseModel
    from pydantic.dataclasses import dataclass as pydantic_dataclass
    from typing import List
    
    from dataclasses import dataclass
    
    
    def model_from_dataclass(kls: 'StdlibDataclass') -> Type[BaseModel]:
        """Converts a stdlib dataclass to a pydantic BaseModel"""
        return pydantic_dataclass(kls).__pydantic_model__
    
    @dataclass
    class Item:
        id: int = None
        stuff: str = None
        height: float = None
    
    ItemBaseModel = model_from_dataclass(Item)
    

    【讨论】:

    • 我知道 pydantic dataclasses drop-in 替换,但不知道如何让字段骆驼大小写。在我的问题中,我让 pydantic 模型扩展了一个 Pydantic 模型,该模型具有用于生成驼峰式字段别名的配置。
    猜你喜欢
    • 2023-04-10
    • 2021-01-29
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2011-10-18
    • 2022-08-24
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多