先定义一个模型:
from pydantic import BaseModel,field_validator
class UserInfo(BaseModel):
"""用户信息数据模型,用于数据验证和类型提示"""
id: int # 用户ID
parent_id: int # 父级ID
name: str # 姓名
username: str # 用户名
password: str # 密码(哈希后)
salt: str # 密码盐值
mobile: str # 手机号
email: str # 邮箱
avatar: str # 头像URL
level: int # 用户等级
level_expire_time: int # 等级过期时间
gender: int # 性别(0-未知 1-男 2-女)
bio: str # 个人简介
access_token: str # 用户token
expires_in: int # 过期时间
@field_validator("level")
def compute_level(cls, v: int, values):
"""自动计算 level,如果过期则返回 0"""
# If level is explicitly set to None, treat it as 0
if v is None:
return 0
level_expire_time = values.data.get("level_expire_time")
if level_expire_time is None:
return 0
if level_expire_time < int(time.time()):
return 0
return v # Return the provided value if not expired
通过调试发现,只加载了level字段之前的9个字段:
从而得出结论field_validator 方法是检索到这个字段的时候触发的,所以如果想在期中获取level_expire_time 应该改变顺序
class UserInfo(BaseModel):
"""用户信息数据模型,用于数据验证和类型提示"""
id: int # 用户ID
parent_id: int # 父级ID
name: str # 姓名
username: str # 用户名
password: str # 密码(哈希后)
salt: str # 密码盐值
mobile: str # 手机号
email: str # 邮箱
avatar: str # 头像URL
level_expire_time: int # 等级过期时间
level: int # 用户等级
gender: int # 性别(0-未知 1-男 2-女)
bio: str # 个人简介
access_token: str # 用户token
expires_in: int # 过期时间
@field_validator("level")
def compute_level(cls, v: int, values):
"""自动计算 level,如果过期则返回 0"""
# If level is explicitly set to None, treat it as 0
if v is None:
return 0
#使用时level_expire_time字段要定义在level之前,否则获取不到
level_expire_time = values.data.get("level_expire_time")
if level_expire_time is None:
return 0
if level_expire_time < int(time.time()):
return 0
return v # Return the provided value if not expired
修改后成功拿到值: