From a63e1a5c2b8e810f3f607605a5f4976b24961560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 5 Oct 2025 19:47:39 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Handle=20creating=20ModelField?= =?UTF-8?q?=20in=20v1=20when=20v2=20is=20not=20installed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/utils.py | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/fastapi/utils.py b/fastapi/utils.py index 4c74d8d9d..0d8e16ad8 100644 --- a/fastapi/utils.py +++ b/fastapi/utils.py @@ -87,22 +87,22 @@ def create_model_field( ) -> ModelField: class_validators = class_validators or {} - if annotation_is_pydantic_v1(type_) or version == "1": - model_config = v1.BaseConfig - field_info = field_info or v1.FieldInfo() - kwargs = { - "name": name, - "field_info": field_info, - "type_": type_, - "class_validators": class_validators, - "default": default, - "required": required, - "model_config": model_config, - "alias": alias, - } + v1_model_config = v1.BaseConfig + v1_field_info = field_info or v1.FieldInfo() + v1_kwargs = { + "name": name, + "field_info": v1_field_info, + "type_": type_, + "class_validators": class_validators, + "default": default, + "required": required, + "model_config": v1_model_config, + "alias": alias, + } + if annotation_is_pydantic_v1(type_) or version == "1": try: - return v1.ModelField(**kwargs) # type: ignore[arg-type] + return v1.ModelField(**v1_kwargs) # type: ignore[arg-type] except RuntimeError: raise fastapi.exceptions.FastAPIError(_invalid_args_message) from None elif PYDANTIC_V2: @@ -116,6 +116,12 @@ def create_model_field( return v2.ModelField(**kwargs) # type: ignore[arg-type] except PydanticSchemaGenerationError: raise fastapi.exceptions.FastAPIError(_invalid_args_message) from None + # Pydantic v2 is not installed, but it's not a Pydantic v1 ModelField, it could be + # a Pydantic v1 type, like a constrained int + try: + return v1.ModelField(**v1_kwargs) # type: ignore[arg-type] + except RuntimeError: + raise fastapi.exceptions.FastAPIError(_invalid_args_message) from None def create_cloned_field(