Skip to content

pydantic

pydantic - топ либа

Валидаторы

  • Всегда надо вернуть какое-то значение или ValueError / AssertionError
class UserModel(BaseModel):
    name: str

    @validator('name')
    def name_must_contain_space(cls, v, values, **kwargs):
        if ' ' not in v:
            raise ValueError('must contain a space')
        return v.title()
  • v - значение поля
  • values - словарь других полей

    • ВАЖНО: в словаре будут лишь те поля, которые находятся выше целевого поля:
    class Model(BaseModel):
        field_1: str
        field_2: str
        field_3: str
    
        @validator('field_2')
        def validate_field_2(cls, v, values):
            # values = {'field_1': ...} <- field_3 тут не будет
            ...
    
  • @validator(..., pre=True) - валидатор будет вызван перед основной валидацией; полезно, когда нужно сделать парсинг:

    class DemoModel(BaseModel):
        square_numbers: List[int] = []
    
        @validator('square_numbers', pre=True)
        def split_str(cls, v):
            if isinstance(v, str):
                return v.split('|')
            return v
    
    • ^ то есть square_numbers - это список интов, но можно передать и строку, которая распарсится в список
    • @validator(..., always=True) - запуск валидатора, даже если поле не заполнено; полезно, когда нужно собрать значение по умолчанию из других полей (=> используем вместе с values)
    • Хотя для простых ситуаций лучше использовать Field(default_factory=...)
    • А для комплексных - @root_validator:
    @root_validator
    def set_payment_schema_info_from_agreement(cls, values):
        if not values.get('payment_schema_info') and values.get('agreement'):
            values['payment_schema_info'] = PaymentSchemaInfo.from_agreement(values['agreement'])
    
        return values