python field_validator 获取不到参数问题

先定义一个模型:

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

修改后成功拿到值:

 

C:\Users\lanpe>labelme Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "D:\Anaconda\Scripts\labelme.exe\__main__.py", line 4, in <module> File "D:\Anaconda\Lib\site-packages\labelme\__main__.py", line 15, in <module> from labelme.app import MainWindow File "D:\Anaconda\Lib\site-packages\labelme\app.py", line 21, in <module> from labelme._automation import bbox_from_text File "D:\Anaconda\Lib\site-packages\labelme\_automation\bbox_from_text.py", line 6, in <module> import osam File "D:\Anaconda\Lib\site-packages\osam\__init__.py", line 5, in <module> from . import apis # noqa: F401 ^^^^^^^^^^^^^^^^^^ File "D:\Anaconda\Lib\site-packages\osam\apis.py", line 7, in <module> from . import _models File "D:\Anaconda\Lib\site-packages\osam\_models\__init__.py", line 1, in <module> from .efficientsam import EfficientSam10m # noqa: F401 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Anaconda\Lib\site-packages\osam\_models\efficientsam\__init__.py", line 1, in <module> from ._models import EfficientSam10m # noqa: F401 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Anaconda\Lib\site-packages\osam\_models\efficientsam\_models.py", line 4, in <module> from osam import types File "D:\Anaconda\Lib\site-packages\osam\types\__init__.py", line 3, in <module> from ._annotation import Annotation # noqa: F401 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Anaconda\Lib\site-packages\osam\types\_annotation.py", line 10, in <module> class Annotation(pydantic.BaseModel): File "D:\Anaconda\Lib\site-packages\osam\types\_annotation.py", line 18, in Annotation @pydantic.field_validator("mask") ^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: module 'pydantic' has no attribute 'field_validator'. Did you mean: 'root_validator'?
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值