Browse Source

Allow to have multiple Query parameter models

pull/12944/head
Yurii Karabas 9 months ago
parent
commit
d8d097deab
  1. 41
      fastapi/dependencies/utils.py

41
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_)
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
return fields
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
for field in fields:
field_info = field.field_info
assert isinstance(
field_info, params.Param
), "Params must be subclasses of Param"
if lenient_issubclass(field.type_, BaseModel):
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
field=field, value=params_to_process, values=values, loc=loc
)
return {first_field.name: v_}, errors_
for field in fields:
else:
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 errors_:
errors.extend(errors_)
else:

Loading…
Cancel
Save