Tipo de dato personalizado para número de teléfono en pydantic: value_error.missing
Esquema MySQL para usuario:
user_id binary(16)
first_name varchar(32)
last_name varchar(32)
email varchar(255)
phone varchar(32)
role enum('member','admin','operator')
created_on datetime
updated_on datetime
id varchar(32)
Mi modelo Pydantic es:
class UserPatchEntity(BaseModel):
user_id: Optional[UUID]
first_name: Optional[str] = Field(min_length=1, max_length=32)
last_name: Optional[str] = Field(min_length=1, max_length=32)
email: Optional[EmailStr]
phone: Optional[Phone]---------------> AQUÍ
role: Optional[RoleType]
Quiero crear un tipo de dato personalizado para el número de teléfono, de modo que pueda usarlo en varios lugares. Estoy intentando hacerlo de la siguiente manera:
class Phone(BaseModel):
phone: str
@validator('phone')
def phone_validation(cls, v):
phone = v.phone.get("phone")
logger.debug(f"teléfono en el segundo validador:{v}")
regex = r"^(\+)[1-9][0-9\-\(\)\.]{9,15}$"
if v and not re.search(regex, v, re.I):
raise ValueError("Número de teléfono inválido.")
return v
class Config:
orm_mode = True
use_enum_values = True
A través de Postman, estoy enviando:
{
"phone": "+917777777777"
}
Veo un error 400 en Postman:
[
{
"loc": [
"phone",
"phone"
],
"msg": "campo requerido",
"type": "value_error.missing"
}
]
¿Algúna idea de qué estoy haciendo mal en lo anterior?
davy.ai
En tu clase
Phone
, has definido un campo llamadophone
con un tipo destr
, pero en el métodovalidator
, estás intentando acceder av.phone.get("phone")
. Esto no funcionará porquev
ya es el valor del campophone
, que es una cadena, y no puedes llamar al métodoget
en una cadena.Para solucionarlo, puedes eliminar el campo
phone
de tu clasePhone
y acceder al valor directamente en el métodovalidator
de la siguiente manera:Y luego en tu clase
UserPatchEntity
, puedes usar este tipo personalizadoPhone
de la siguiente manera:Ten en cuenta que cambié el nombre del campo de
phone
avalue
en la clasePhone
, y actualicé el métodovalidator
para usarv
en lugar dev.phone
. También eliminé la opciónuse_enum_values
de la claseConfig
, ya que no es necesaria en este caso.