From 2b0e941acb035ba880a44c8b407a794a3b5d8403 Mon Sep 17 00:00:00 2001 From: JONEMI19 Date: Mon, 13 Mar 2023 18:01:40 +0000 Subject: [PATCH] change parsing of return values to account for multiple copies of same param --- fastapi/dependencies/utils.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index a881312d7..479a740c6 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -18,6 +18,8 @@ from typing import ( cast, ) +from collections import defaultdict + import anyio from fastapi import params from fastapi.concurrency import ( @@ -253,10 +255,11 @@ def is_scalar_mapping_field(field: ModelField) -> bool: if (field.shape in mapping_shapes) and not lenient_issubclass( field.type_, BaseModel ): - if field.sub_fields is not None: - for sub_field in field.sub_fields: - if not is_scalar_field(sub_field): - return False + if field.sub_fields is None: + return True + for sub_field in field.sub_fields: + if (not is_scalar_field(sub_field)) and (not is_scalar_sequence_field(sub_field)): + return False return True if lenient_issubclass(field.type_, mapping_types): return True @@ -625,7 +628,9 @@ def request_params_to_args( elif is_scalar_mapping_field(field) and isinstance( received_params, (QueryParams,) ): - value = received_params._dict + value = defaultdict(list) + for key, field_value in received_params.multi_items(): + value[key].append(field_value) else: value = received_params.get(field.alias) field_info = field.field_info