From d8d097deaba5c1f36ffacdcade3c0cfe96e72cd7 Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Sat, 16 Nov 2024 12:30:31 +0100 Subject: [PATCH] Allow to have multiple Query parameter models --- fastapi/dependencies/utils.py | 55 ++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index e2866b488..26222f27b 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -212,11 +212,15 @@ def get_flat_dependant( def _get_flat_fields_from_params(fields: List[ModelField]) -> List[ModelField]: if not fields: return fields - first_field = fields[0] - if len(fields) == 1 and lenient_issubclass(first_field.type_, BaseModel): - fields_to_extract = get_cached_model_fields(first_field.type_) - return fields_to_extract - return fields + + fields_to_extract = [] + for f in fields: + if lenient_issubclass(f.type_, BaseModel): + fields_to_extract.extend(get_cached_model_fields(f.type_)) + else: + fields_to_extract.append(f) + return fields_to_extract + def get_flat_params(dependant: Dependant) -> List[ModelField]: @@ -747,15 +751,15 @@ def request_params_to_args( if not fields: return values, errors - first_field = fields[0] fields_to_extract = fields - single_not_embedded_field = False - if len(fields) == 1 and lenient_issubclass(first_field.type_, BaseModel): - fields_to_extract = get_cached_model_fields(first_field.type_) - single_not_embedded_field = True - params_to_process: Dict[str, Any] = {} + model_fields = [field for field in fields if lenient_issubclass(field.type_, BaseModel)] + if model_fields: + fields_to_extract = [ + cached_field for field in fields for cached_field in get_cached_model_fields(field.type_) + ] + processed_keys = set() for field in fields_to_extract: @@ -780,27 +784,24 @@ def request_params_to_args( if key not in processed_keys: params_to_process[key] = value - if single_not_embedded_field: - field_info = first_field.field_info - assert isinstance( - field_info, params.Param - ), "Params must be subclasses of Param" - loc: Tuple[str, ...] = (field_info.in_.value,) - v_, errors_ = _validate_value_with_model_field( - field=first_field, value=params_to_process, values=values, loc=loc - ) - return {first_field.name: v_}, errors_ - for field in fields: - value = _get_multidict_value(field, received_params) field_info = field.field_info assert isinstance( field_info, params.Param ), "Params must be subclasses of Param" - loc = (field_info.in_.value, field.alias) - v_, errors_ = _validate_value_with_model_field( - field=field, value=value, values=values, loc=loc - ) + + if lenient_issubclass(field.type_, BaseModel): + loc: Tuple[str, ...] = (field_info.in_.value,) + v_, errors_ = _validate_value_with_model_field( + field=field, value=params_to_process, values=values, loc=loc + ) + else: + value = _get_multidict_value(field, received_params) + loc = (field_info.in_.value, field.alias) + v_, errors_ = _validate_value_with_model_field( + field=field, value=value, values=values, loc=loc + ) + if errors_: errors.extend(errors_) else: