如何在Pydantic v2中复用通用Decimal字段定义?
如何在Pydantic v2中复用通用Decimal字段定义?
嘿,我完全懂你的烦恼——重复写一模一样的字段类型和Field配置实在太啰嗦了!针对你在Pydantic v2里想复用这类Decimal字段定义的需求,这里有个能彻底解决问题的方案,帮你把类型和配置都封装起来,再也不用重复写Decimal | None了:
核心思路:用Annotated封装类型与字段配置
在Pydantic v2中,Annotated是处理这类元数据复用的绝佳工具,我们可以把字段类型(Decimal | None)和通用的Field配置打包成一个可复用的函数,只需要传入你要自定义的description即可:
from typing import Annotated, Optional from pydantic import BaseModel, Field from decimal import Decimal def BenchmarkField(description: str) -> Annotated[Optional[Decimal], Field]: return Annotated[ Optional[Decimal], Field( default=None, max_digits=80, decimal_places=5, description=description, json_schema_extra={"type": "display"} ) ] # 现在使用起来超简洁! class ModalA(BaseModel): benchmark2: BenchmarkField("Benchmark 2") benchmark3: BenchmarkField("Benchmark 3") benchmark4: BenchmarkField("Benchmark 4")
为什么这个方法有效?
Pydantic v2会自动识别Annotated元组里的Field实例,把它作为对应字段的配置;同时元组里的第一个元素就是字段的类型(这里是Optional[Decimal],也就是你之前写的Decimal | None)。这样一来,你只需要调用BenchmarkField并传入自定义的描述,就能完成整个字段的定义,完全没有重复代码。
如果你之后需要调整通用配置(比如修改max_digits或者json_schema_extra),只需要在BenchmarkField函数里改一次,所有用到这个字段的模型都会自动生效,维护起来也超方便!
备注:内容来源于stack exchange,提问作者ejlu
相关产品推荐
相关产品推荐

