I would like to set default email in case email not provided, i.e:
name = a
last_name = b
email = None
email will become "[email protected]"
I tried something like that but obviously didn't work as the name,last_name not define in function.
class User(BaseModel):
name: Optional[str] = ''
last_name: Optional[str] = ''
email: EmailStr
@validator('email')
def set_email(cls, email):
if not email:
return name + last_name + '@email.com'
else:
return email
Update- still not working, i tried:
@root_validator(pre=True)
def email_set_config(cls, values):
email, name ,last_name = values.get('email'), values.get('name') , values.get('last_name')
if email is None :
email= name + '_' + name + '@' + last_name
return values
Solution:
added to Class :
--Update
class Config:
validate_assignment = True
@validator('email')
def set_email(cls, v, values, **kwargs):
return email or values["name"] + '_' + values["name"] + '@' + ["last_name"]
Not enough reputation to comment, so I'll just expand on @NobbyNobbs answer here^^
For your last example using pydantic.validator, you can use the always kwargs to always run a validator even if the value is not provided.
Link in the doc: https://pydantic-docs.helpmanual.io/usage/validators/#validate-always
So your example would be:
from typing import Optional
import pydantic
class User(pydantic.BaseModel):
first_name: str
last_name: str
email: Optional[pydantic.EmailStr]
@pydantic.validator('email', always=True)
def set_email(cls, v, values, **kwargs):
return v or values["first_name"] + '_' + values["last_name"] + '@email.com'
if __name__ == "__main__":
print(User(first_name="jon", last_name="doe")) # first_name='jon' last_name='doe' email='[email protected]'
print(User(first_name="jon", last_name="doe", email=None)) # first_name='jon' last_name='doe' email='[email protected]'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With