从Python数据类动态创建Pydantic模型

从Python数据类动态创建Pydantic模型,python,pydantic,Python,Pydantic,我想从一个数据类动态创建一个Pydantic模型,类似于从一个数据类动态创建一个Marshmallow模式,就像在Marshmallow或dataclass中一样。是否已经有一个图书馆或简单的方法来做到这一点 一些背景-我更喜欢在业务逻辑中使用dataclass,而不是直接使用Pydantic模型。我仅在FastAPI应用程序中使用Pydantic模型对带有驼峰大小写字段的数据进行序列化/反序列化。然而,我发现自己基本上复制了数据类定义,这是没有效率的 样本输入: from typing imp

我想从一个数据类动态创建一个Pydantic模型,类似于从一个数据类动态创建一个Marshmallow模式,就像在Marshmallow或dataclass中一样。是否已经有一个图书馆或简单的方法来做到这一点

一些背景-我更喜欢在业务逻辑中使用dataclass,而不是直接使用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

也许是这样的?(来自)


我知道pydantic数据类的替代品,但不确定如何将字段骆驼壳化。在我的问题中,我让pydantic模型扩展pydantic模型,该模型具有用于生成驼峰式字段别名的配置。
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)