From 61b683e5624302d34bee919e8dc1b09cfe465223 Mon Sep 17 00:00:00 2001 From: JONEMI21 Date: Fri, 7 Nov 2025 09:28:03 +0000 Subject: [PATCH] fix for pydantic v1 --- fastapi/_compat/v1.py | 14 ++++++-------- fastapi/dependencies/utils.py | 9 ++++++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/fastapi/_compat/v1.py b/fastapi/_compat/v1.py index 0efc250c1..1d5c83fa7 100644 --- a/fastapi/_compat/v1.py +++ b/fastapi/_compat/v1.py @@ -6,7 +6,6 @@ from typing import ( Callable, Dict, List, - Mapping, Sequence, Set, Tuple, @@ -36,9 +35,9 @@ if not PYDANTIC_V2: from pydantic.error_wrappers import ErrorWrapper as ErrorWrapper from pydantic.errors import MissingError from pydantic.fields import ( # type: ignore[attr-defined] + MAPPING_LIKE_SHAPES, SHAPE_FROZENSET, SHAPE_LIST, - SHAPE_MAPPING, SHAPE_SEQUENCE, SHAPE_SET, SHAPE_SINGLETON, @@ -84,9 +83,9 @@ else: from pydantic.v1.error_wrappers import ErrorWrapper as ErrorWrapper from pydantic.v1.errors import MissingError from pydantic.v1.fields import ( + MAPPING_LIKE_SHAPES, SHAPE_FROZENSET, SHAPE_LIST, - SHAPE_MAPPING, SHAPE_SEQUENCE, SHAPE_SET, SHAPE_SINGLETON, @@ -147,10 +146,7 @@ sequence_shape_to_type = { SHAPE_TUPLE_ELLIPSIS: list, } -mapping_shapes = { - SHAPE_MAPPING, -} -mapping_shapes_to_type = {SHAPE_MAPPING: Mapping} +mapping_shapes = MAPPING_LIKE_SHAPES @dataclass @@ -233,7 +229,9 @@ def is_pv1_scalar_sequence_mapping_field(field: ModelField) -> bool: ): if field.sub_fields is not None: for sub_field in field.sub_fields: - if not is_scalar_sequence_field(sub_field): + if not ( + is_scalar_sequence_field(sub_field) or is_scalar_field(sub_field) + ): return False return True return False diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 5fb603e6a..1aa78c4e2 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -701,6 +701,13 @@ async def solve_dependencies( ) +def _extract_error_locs(errors_): + if isinstance(errors_, list): + errors_ = may_v1._regenerate_error_with_loc(errors=errors_, loc_prefix=()) + + return {err["loc"][2] for err in errors_ if len(err["loc"]) >= 3} + + def _validate_value_with_model_field( *, field: ModelField, value: Any, values: Dict[str, Any], loc: Tuple[str, ...] ) -> Tuple[Any, List[Any]]: @@ -717,7 +724,7 @@ def _validate_value_with_model_field( and (is_scalar_sequence_mapping_field(field) or is_scalar_mapping_field(field)) ): # Remove failing keys from the dict and try to re-validate - invalid_keys = {err["loc"][2] for err in errors_ if len(err["loc"]) >= 3} + invalid_keys = _extract_error_locs(errors_) v_, errors_ = field.validate( {k: v for k, v in value.items() if k not in invalid_keys}, values,