如何在创建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
相关产品推荐
相关产品推荐

