能否在Pydantic模型中用常量名定义字段后通过常量值引用字段
Pydantic模型用常量值作为字段名的实现方法
你原本的写法无法实现目标需求:直接将常量名作为类属性声明,Pydantic会把常量名本身(也就是字符串COLUMN_MEAN)识别为字段名,实例化时只能传COLUMN_MEAN=2.1才能匹配,无法直接用常量对应的值mean传参。
你可以用以下两种方案实现需求:
方案1:使用create_model动态生成模型(最简洁)
create_model方法支持传入字典定义字段,字典的键就可以直接用常量的取值,实现你要的效果:
from pydantic import BaseModel, create_model COLUMN_MEAN = "mean" COLUMN_LENGTH = "length" # 动态生成Item模型 Item = create_model( "Item", **{ COLUMN_MEAN: (float, ...), # ...表示该字段为必填项 COLUMN_LENGTH: (int, ...) } )
使用方式完全符合你的要求:
# 实例化正常运行 item = Item(mean=2.1, length=10) # 取值两种方式都支持 print(item.mean) # 输出 2.1 print(getattr(item, COLUMN_MEAN)) # 用常量取值也输出2.1
方案2:手动给类注解赋值
如果你不想用动态生成模型的方法,也可以先声明空的BaseModel子类,再手动给__annotations__属性添加字段:
from pydantic import BaseModel COLUMN_MEAN = "mean" COLUMN_LENGTH = "length" class Item(BaseModel): pass # 动态添加字段注解 Item.__annotations__[COLUMN_MEAN] = float Item.__annotations__[COLUMN_LENGTH] = int
使用效果和方案1完全一致,实例化、取值都可以按照你预期的方式运行。
以上两种方案在Pydantic V1和V2版本中都可以正常使用。
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

