РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
182 of 307 menu

Декоратор 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', чтобы преобразовать строку в число до стандартной валидации:

<+python+> from fastapi import FastAPI from pydantic import BaseModel, field_validator app = FastAPI() class Item(BaseModel): price: int @field_validator('price', mode='before') @classmethod def parse_price(cls, value): if isinstance(value, str): return int(value.replace('$', '')) return value @app.post('/items/') def create_item(item: Item): return {'price': item.price} <-python+>

Результат выполнения кода для данных {"price": "$100"}:

{"price": 100}

Смотрите также

  • класс BaseModel,
    который является базой для создания Pydantic-моделей
  • декоратор model_validator,
    который позволяет валидировать всю модель целиком
  • класс Field,
    который задаёт дополнительные ограничения для полей
  • метод model_validate,
    который проверяет данные на соответствие модели
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить