You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SQLModel自定义Validator验证重复密码报错的技术求助

解决SQLModel中重复密码验证的AttributeError问题

你遇到的AttributeError: type object 'UserCreate' has no attribute 'password'是因为验证器里错误地用cls.password访问密码——cls代表的是UserCreate类本身,而非具体的实例对象,类本身并不持有password属性,自然取不到值。

下面是两种正确的实现方式:

方式一:基于Pydantic v1风格的validator(兼容旧版SQLModel)

修改验证器,通过values参数获取已提交的password值:

from pydantic import validator, HTTPException
from sqlmodel import SQLModel, Field, Optional

class UserBase(SQLModel):
    firstname: str
    lastname: str
    username: str
    email: str
    password: str
    age: int

class UserCreate(UserBase):
    repeat_password: str

    @validator("repeat_password")
    def check_repeat_password(cls, value, values):
        password = values.get("password")
        if not password or value != password:
            raise HTTPException(
                status_code=400,
                detail="Repeat password does not match password."
            )
        return value

class UserTable(UserBase, table=True):
    __tablename__ = "users"
    id: Optional[int] = Field(default=None, primary_key=True)

方式二:基于Pydantic v2的field_validator(推荐,适配新版SQLModel)

新版SQLModel基于Pydantic v2,更推荐使用field_validator,通过info.data获取其他字段值:

from pydantic import field_validator, HTTPException
from sqlmodel import SQLModel, Field, Optional

class UserBase(SQLModel):
    firstname: str
    lastname: str
    username: str
    email: str
    password: str
    age: int

class UserCreate(UserBase):
    repeat_password: str

    @field_validator("repeat_password")
    @classmethod
    def check_repeat_password(cls, value, info):
        password = info.data.get("password")
        if value != password:
            raise HTTPException(
                status_code=400,
                detail="Repeat password does not match password."
            )
        return value

class UserTable(UserBase, table=True):
    __tablename__ = "users"
    id: Optional[int] = Field(default=None, primary_key=True)

注意:如果需要确保password字段已完成验证,可以在field_validator中添加mode="after"参数,或者调整字段顺序(保证password在repeat_password之前定义)。

内容的提问来源于stack exchange,提问作者Data Mastery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:40:24