Pydantic中ConfigDict(use_enum_values=True)默认值无效,如何设默认值并禁改?
Pydantic枚举默认值与字段权限问题解决
问题1:设置枚举字段默认值,使model_dump输出枚举值
当配置ConfigDict(use_enum_values=True)时,直接使用枚举实例作为默认值会导致实例化后字段保留枚举对象,而用户传入枚举实例时会被自动转换为对应值。要让默认值在序列化时输出枚举值,只需将默认值设为枚举的值而非枚举实例,同时保持字段类型注解为枚举类型:
from enum import Enum from pydantic import BaseModel, ConfigDict class X(Enum): x = "X" y = "Y" z = "Z" class A(BaseModel): model_config = ConfigDict(use_enum_values=True, frozen=True) # 使用枚举值作为默认值,类型注解仍为枚举类型 x: X = X.x.value # 测试结果 >>> A() A(x='X') >>> A().model_dump() {'x': 'X'}
Pydantic会自动将字符串值验证并转换为对应的枚举实例,use_enum_values=True会在序列化时将其转回枚举值,满足序列化需求。
问题2:禁止用户设置字段,由模型自行初始化
要禁止用户在实例化时指定该字段,同时让模型自动初始化默认值,可使用Field(init=False)参数,该字段将不会出现在模型的构造函数参数中,用户无法传入值覆盖:
from enum import Enum from pydantic import BaseModel, ConfigDict, Field class X(Enum): x = "X" y = "Y" z = "Z" class A(BaseModel): model_config = ConfigDict(use_enum_values=True, frozen=True) # init=False 禁止用户传入该字段,同时设置固定默认值 x: X = Field(default=X.x.value, init=False) # 测试结果 >>> A() A(x='X') >>> A(x=X.y) # 触发错误:TypeError: A.__init__() got an unexpected keyword argument 'x' >>> A().model_dump() {'x': 'X'}
若需动态初始化该字段,可结合model_post_init方法实现自定义逻辑:
class A(BaseModel): model_config = ConfigDict(use_enum_values=True, frozen=True) x: X = Field(init=False) def model_post_init(self, __context) -> None: # 自定义初始化逻辑,例如根据其他字段动态赋值 self.x = X.x.value
这样既保证用户无法修改该字段,又能灵活控制字段的初始化值。
内容的提问来源于stack exchange,提问作者Shuzheng
相关产品推荐
相关产品推荐

