FastAPI для начинающих: API с базой данных и тестамиВходные данные и Pydantic v2Ограничения полей и ошибки валидации

Ограничения полей и ошибки валидации

Уроки курсаОграничения полей и ошибки валидации

Как прочитать ответ 422 и найти неверное поле

Возьмём полный маршрут с моделью, которую объявили выше:

from fastapi import FastAPI
from pydantic import BaseModel, Field

app = FastAPI()

class RoomIn(BaseModel):
    name: str = Field(..., min_length=2, max_length=50)
    capacity: int = Field(..., ge=1, le=50)

@app.post("/api/rooms")
def create_room(room: RoomIn):
    return {"received_name": room.name, "capacity": room.capacity}

Отправим запрос с намеренно неверными значениями:

{"name": "А", "capacity": 0}

FastAPI вернёт статус 422. Ниже сокращённое тело ответа: у каждой ошибки оставлены loc, msg и type.

{
  "detail": [
    {
      "loc": ["body", "name"],
      "msg": "String should have at least 2 characters",
      "type": "string_too_short"
    },
    {
      "loc": ["body", "capacity"],
      "msg": "Input should be greater than or equal to 1",
      "type": "greater_than_equal"
    }
  ]
}

detail — массив: каждый объект описывает одно нарушение. Для диагностики рассмотрим три показанных поля; в полном ответе могут быть и другие, например input и ctx.

loc — путь к проблемному месту. Первый элемент "body" говорит, что ошибка в JSON-теле запроса. Второй — имя конкретного поля модели. По этому пути сразу понятно, что исправлять.

msg — человекочитаемое описание: что именно нарушено. Видно, что name слишком короткое, а capacity меньше 1.

type — машинный код ошибки: удобен, если нужно обрабатывать ответ программно.

В данном случае оба поля нарушены одновременно, поэтому detail содержит два объекта. Чтобы исправить запрос, достаточно передать name длиной от 2 до 50 символов и capacity от 1 до 50 — например, {"name": "Малый зал", "capacity": 10}.

Поле capacity: int ограничено Field(..., ge=1, le=50). Переданное capacity 0 даёт 422 до вызова обработчика. В одном элементе detail loc равен [body, capacity], а msg сообщает Input should be greater than or equal to 1.
loc указывает поле capacity, msg объясняет нарушенное правило: значение должно быть не меньше 1. Обработчик не вызывается.