You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在创建Pydantic类实例时自动添加对应元数据?

实现Pydantic类自动生成嵌套Meta实例的方案

根据需求,我们可以通过给Goal和Insurance类的meta字段设置预设默认值的方式,实现创建实例时自动生成对应嵌套Meta对象的效果,以下是几种可行的实现方式:

方法一:直接指定固定默认实例

这种方式最简单直接,因为Meta参数是固定的,直接给meta字段赋值预设好的Meta实例即可:

from pydantic import BaseModel, Field

class Meta(BaseModel):
    """附加到父对象的元数据"""
    description: str = Field(description="父对象的描述")
    type: str = Field(description="父对象的类型")

class Goal(BaseModel):
    """客户目标"""
    _id: str
    meta: Meta = Meta(description="A customer goal", type="goal")

class Insurance(BaseModel):
    """客户保险"""
    _id: str
    meta: Meta = Meta(description="A customer insurance policy", type="insurance")

使用示例:

# 自动生成meta字段
goal = Goal(_id="goal_001")
print(goal.meta)
# 输出: description='A customer goal' type='goal'

# 也可以手动传入自定义meta覆盖默认值
custom_goal = Goal(_id="goal_002", meta=Meta(description="Custom goal", type="custom"))
print(custom_goal.meta)
# 输出: description='Custom goal' type='custom'

方法二:使用default_factory生成默认实例

如果后续需要动态生成Meta实例(比如依赖其他字段值),可以用Field的default_factory参数,传入一个无参函数返回预设的Meta对象:

from pydantic import BaseModel, Field

class Meta(BaseModel):
    """附加到父对象的元数据"""
    description: str = Field(description="父对象的描述")
    type: str = Field(description="父对象的类型")

class Goal(BaseModel):
    """客户目标"""
    _id: str
    meta: Meta = Field(default_factory=lambda: Meta(description="A customer goal", type="goal"))

class Insurance(BaseModel):
    """客户保险"""
    _id: str
    meta: Meta = Field(default_factory=lambda: Meta(description="A customer insurance policy", type="insurance"))

这种方式的优势是可以灵活扩展函数逻辑,比如后续如果meta的description需要包含_id的值,只需修改lambda函数即可。

方法三:通过基类复用逻辑

如果后续还有更多类似需要自动生成Meta的类,可以创建一个基类封装公共字段,子类仅需重写meta的默认值:

from pydantic import BaseModel, Field

class Meta(BaseModel):
    """附加到父对象的元数据"""
    description: str = Field(description="父对象的描述")
    type: str = Field(description="父对象的类型")

class BaseCustomerItem(BaseModel):
    _id: str
    meta: Meta

class Goal(BaseCustomerItem):
    """客户目标"""
    meta: Meta = Meta(description="A customer goal", type="goal")

class Insurance(BaseCustomerItem):
    """客户保险"""
    meta: Meta = Meta(description="A customer insurance policy", type="insurance")

这种方式可以减少代码重复,让后续新增类的逻辑更简洁。

内容的提问来源于stack exchange,提问作者Davtho1983

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:05:09