概述
动态生成pydantic的basemodel类有两种方式,第一种就是我们比较熟悉的使用exec直接把字符串转变为代码,通过拼接相关字符串实现动态生成;第二种是根据pydantic提供的类来自行组装basemodel类,这种比较常见(我个人认为第一种好像更简单粗暴一点)。
基于exec
示例:
x="""class BM(BaseModel):
x:int
"""
from pydantic import BaseModel
BM=exec(x,{“BaseModel”:BaseModel})#这里要手动把BaseModel类传递进去
基于组装
组装的方式是预先定义所有需要的类型和变量的dict,通过type进行组装生成一个类。
示例如下:
#记录所有字段的限制等的功能
pconfig: Type[pydantic.main.BaseConfig] = type(
"Config",
(PydanticModel.Config,),
{"title": name or cls.__name__, "extra": pydantic.main.Extra.forbid, "fields": {'id': {'ge': 1, 'le': 2147483647, 'description': '', 'title': 'Id'}, 'name': {'max_length': 100, 'description': '', 'title': 'Name'}, 'created_at': {'readOnly': True, 'description': 'The date-time the Tournament record was created at', 'title': 'Created At'}}},
)#这里的相关参数就替代了Field和Form等参数的注释功能
properties={'__annotations__': {'id': <class 'int'>, 'name': <class 'str'>, 'created_at': <class 'datetime.datetime'>}, 'Config': <class 'tortoise.contrib.pydantic.creator.Config'>}
#_name为一个类型
model = cast(Type[PydanticModel], type(_name, (PydanticModel,), properties))