python动态生成pydantic的basemodel类

4 篇文章 1 订阅
1 篇文章 0 订阅

概述

动态生成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))

`Pydantic` 是一个强大的 Python 库,用于数据验证、设置默认值以及模型定义。`BaseModel` 是 `pydantic` 中的核心组件,它是所有其他模式(如表单、数据等)的基础。`Field` 是 `BaseModel` 的一个重要组成部分,它用来声明字段的各种属性。 `BaseModel`: - **定义**: `pydantic.BaseModel` 提供了一个轻量级的方式来创建具有良好结构的数据模型。当你继承自 `BaseModel` 并定义了字段后,它可以自动处理序列化、反序列化(将数据从字典转换为实例或反之)以及错误检查。 - **用途**: 你可以使用它来组织和验证请求体、响应体、配置选项等各种型的数据。 - **实例化**: 只需给 `BaseModel` 的构造函数传递一个字典,其中包含你所定义的字段及其对应值,就可以轻松地初始化模型实例。 `Field`: - **描述**: `Field` 是一个元,用于定义字段的各种特性和行为。例如,你可以指定字段的名字、默认值、是否必需、数据型、格式化规则等。 - **常用属性**: - `name`: 字段名称,用于内部存储和API文档生成。 - `default`: 默认值,如果提供的值缺失则使用这个默认值。 - `required`: 是否是必填项,默认False,如果设为True则字段不能为空。 - `type_`: 数据型,如 `int`, `str`, `List`, `Dict` 等。 - `alias`: 别名,可以在序列化时使用不同的键名。 - `min_length`/`max_length`: 对字符串长度的限制。 - `regex`: 正则表达式验证。 - **实例化**: 当你在 `BaseModel` 中声明一个字段时,例如 `name: str = Field(...)`,实际上是在创建一个 `Field` 实例并将其添加到 `BaseModel` 的内部字段列表中。 使用例子: ```python from pydantic import BaseModel, Field class User(BaseModel): username: str = Field(min_length=5, max_length=20, required=True) email: str = Field(format='email', default=None) age: int = Field(gt=0) # 初始化一个User实例 user_data = {"username": "myusername", "age": 25} user = User(**user_data) # 自动进行验证和型转换 # 序列化成字典 json_user = user.json() ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值