Ограничения полей и ошибки валидации
Уроки курсаОграничения полей и ошибки валидации
Field(0, ge=1) против Field(..., ge=1): что происходит при пропуске поля
Представьте, что кто-то написал модель чуть иначе:
class RoomIn(BaseModel):
name: str = Field(..., min_length=2, max_length=50)
capacity: int = Field(0, ge=1) # default = 0
Теперь у capacity есть значение по умолчанию — 0. Если клиент отправит тело без этого поля:
{"name": "Большой зал"}
Pydantic v2 в стандартной конфигурации подставит 0 и не будет проверять, удовлетворяет ли сам default ограничению ge=1. Обработчик получит capacity=0 и вернёт 200.
При этом если клиент явно передаст "capacity": 0, ограничение сработает и ответ будет 422. Итог: одно и то же значение 0 ведёт себя по-разному в зависимости от того, пришло ли оно из запроса или было подставлено как default.
Чтобы этого не было, используйте Field(..., ge=1). Тогда пропущенное поле даёт 422, а default, нарушающий правило, в принципе не возникает. Значение по умолчанию стоит задавать только тогда, когда оно само по себе допустимо по контракту.
