From 04703fd64388d2cde70fd8bab68fb35be7af27e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 7 Feb 2026 09:19:33 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor=20ModelField.requ?= =?UTF-8?q?ired,=20use=20FieldInfo=20internals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/_compat/v2.py | 4 ---- fastapi/dependencies/utils.py | 8 +++++--- fastapi/openapi/utils.py | 4 ++-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index 3245f75fe..cd0481eff 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -102,10 +102,6 @@ class ModelField: sa = self.field_info.serialization_alias return sa or None - @property - def required(self) -> bool: - return self.field_info.is_required() - @property def default(self) -> Any: return self.get_default() diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index ae89c8b6f..b84bbf863 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -710,7 +710,7 @@ def _validate_value_with_model_field( *, field: ModelField, value: Any, values: dict[str, Any], loc: tuple[str, ...] ) -> tuple[Any, list[Any]]: if value is None: - if field.required: + if field.field_info.is_required(): return None, [get_missing_field_error(loc=loc)] else: return deepcopy(field.default), [] @@ -742,7 +742,7 @@ def _get_multidict_value( ) or (is_sequence_field(field) and len(value) == 0) ): - if field.required: + if field.field_info.is_required(): return else: return deepcopy(field.default) @@ -996,7 +996,9 @@ def get_body_field( BodyModel = create_body_model( fields=flat_dependant.body_params, model_name=model_name ) - required = any(True for f in flat_dependant.body_params if f.required) + required = any( + True for f in flat_dependant.body_params if f.field_info.is_required() + ) BodyFieldInfo_kwargs: dict[str, Any] = { "annotation": BodyModel, "alias": "body", diff --git a/fastapi/openapi/utils.py b/fastapi/openapi/utils.py index 0f6cf8e3a..bcad0be75 100644 --- a/fastapi/openapi/utils.py +++ b/fastapi/openapi/utils.py @@ -161,7 +161,7 @@ def _get_openapi_operation_parameters( parameter = { "name": name, "in": param_type.value, - "required": param.required, + "required": param.field_info.is_required(), "schema": param_schema, } if field_info.description: @@ -198,7 +198,7 @@ def get_openapi_operation_request_body( ) field_info = cast(Body, body_field.field_info) request_media_type = field_info.media_type - required = body_field.required + required = body_field.field_info.is_required() request_body_oai: dict[str, Any] = {} if required: request_body_oai["required"] = required