使用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
相关产品推荐
相关产品推荐

