From 3d90df0718ae16991dad29941bd61186ff9f0097 Mon Sep 17 00:00:00 2001 From: dotX12 Date: Sun, 23 Jul 2023 01:58:33 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20parsing=20values=20in=20Fo?= =?UTF-8?q?rmData=20for=20Union/Optional=20in=20list,=20set,=20tuple=20and?= =?UTF-8?q?=20more=20for=20PydanticV2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/_compat.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 2233fe33c..2aef71d43 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -223,7 +223,21 @@ if PYDANTIC_V2: ) and not isinstance(field.field_info, params.Body) def is_sequence_field(field: ModelField) -> bool: - return field_annotation_is_sequence(field.field_info.annotation) + return field_annotation_is_sequence( + field.field_info.annotation + ) or field_annotation_is_optional_sequence(field.field_info.annotation) + + def field_annotation_is_optional_sequence( + annotation: Union[Type[Any], None] + ) -> bool: + origin = get_origin(annotation) + if origin is Union: + args = get_args(annotation) + first_argument = args[0] + if hasattr(first_argument, "__origin__"): + if first_argument.__origin__ in sequence_types: + return True + return False def is_scalar_sequence_field(field: ModelField) -> bool: return field_annotation_is_scalar_sequence(field.field_info.annotation)