Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python [Pydantic] - default values based other object in the class

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

  • Actually it is working without define class Config:
    class Config:
        validate_assignment = True
    @validator('email')
    def set_email(cls, v, values, **kwargs):
        return email or values["name"] + '_' + values["name"] + '@' + ["last_name"]

like image 258
AviC Avatar asked Aug 05 '26 01:08

AviC


1 Answers

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]'
like image 186
obendidi Avatar answered Aug 07 '26 15:08

obendidi



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!