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



我想从数据类动态创建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

也许是这样的?(从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)

最新更新