Декоратор field_validator
Декоратор field_validator применяется к методу внутри класса Pydantic-модели.
Он позволяет проверять и преобразовывать значение конкретного поля.
Первым параметром передаётся имя поля (или несколько имён в виде строк).
Вторым необязательным параметром является режим валидации mode,
который может принимать значения 'before', 'after' или 'wrap'.
Метод-валидатор обязательно должен быть классметодом и принимать значение поля.
Синтаксис
from pydantic import field_validator
class ModelName(BaseModel):
field_name: type
@field_validator('field_name')
@classmethod
def validate_field_name(cls, value):
# validation logic
return value
Пример
Давайте создадим модель с полем name и проверим,
что его длина не превышает 5 символов:
from fastapi import FastAPI
from pydantic import BaseModel, field_validator
app = FastAPI()
class User(BaseModel):
name: str
@field_validator('name')
@classmethod
def validate_name(cls, value: str) -> str:
if len(value) > 5:
raise ValueError('name too long')
return value
@app.post('/users/')
def create_user(user: User):
return {'user': user.name}
При отправке корректных данных {"name": "abcde"} результат будет таким:
{"user": "abcde"}
При отправке некорректных данных {"name": "abcdefgh"} FastAPI вернёт ошибку 422:
{"detail": [{"type": "value_error", "loc": ["body", "name"], "msg": "Value error, name too long"}]}
Пример
Давайте применим валидатор к нескольким полям одновременно.
Проверим, что поля first и second не пустые:
from fastapi import FastAPI
from pydantic import BaseModel, field_validator
app = FastAPI()
class Pair(BaseModel):
first: str
second: str
@field_validator('first', 'second')
@classmethod
def validate_not_empty(cls, value: str) -> str:
if not value:
raise ValueError('field cannot be empty')
return value
@app.post('/pairs/')
def create_pair(pair: Pair):
return {'first': pair.first, 'second': pair.second}
Результат выполнения кода для данных {"first": "hello", "second": "user"}:
{"first": "hello", "second": "user"}
Пример
Давайте используем режим mode='before',
чтобы преобразовать строку в число до стандартной валидации:
Результат выполнения кода для данных {"price": "$100"}:
{"price": 100}
Смотрите также
-
класс
BaseModel,
который является базой для создания Pydantic-моделей -
декоратор
model_validator,
который позволяет валидировать всю модель целиком -
класс
Field,
который задаёт дополнительные ограничения для полей -
метод
model_validate,
который проверяет данные на соответствие модели