|
|
|
@ -26,18 +26,16 @@ from fastapi._compat import ( |
|
|
|
evaluate_forwardref, |
|
|
|
field_annotation_is_scalar, |
|
|
|
field_annotation_is_scalar_mapping, |
|
|
|
field_annotation_is_scalar_sequence_mapping, |
|
|
|
field_annotation_is_scalar_mapping_field, |
|
|
|
field_annotation_is_scalar_sequence, |
|
|
|
field_annotation_is_scalar_sequence_mapping, |
|
|
|
field_annotation_is_scalar_sequence_mapping_field, |
|
|
|
field_annotation_is_sequence, |
|
|
|
get_cached_model_fields, |
|
|
|
get_missing_field_error, |
|
|
|
is_bytes_or_nonable_bytes_annotation, |
|
|
|
is_bytes_sequence_annotation, |
|
|
|
is_scalar_field, |
|
|
|
is_scalar_mapping_field, |
|
|
|
is_scalar_sequence_field, |
|
|
|
is_scalar_sequence_mapping_field, |
|
|
|
is_sequence_field, |
|
|
|
is_uploadfile_or_nonable_uploadfile_annotation, |
|
|
|
is_uploadfile_sequence_annotation, |
|
|
|
lenient_issubclass, |
|
|
|
@ -542,7 +540,9 @@ def analyze_param( |
|
|
|
assert ( |
|
|
|
is_scalar_field(field) |
|
|
|
or field_annotation_is_scalar_mapping_field(field.field_info.annotation) |
|
|
|
or field_annotation_is_scalar_sequence_mapping_field(field.field_info.annotation) |
|
|
|
or field_annotation_is_scalar_sequence_mapping_field( |
|
|
|
field.field_info.annotation |
|
|
|
) |
|
|
|
or field_annotation_is_scalar_sequence(field.field_info.annotation) |
|
|
|
or lenient_issubclass(field.field_info.annotation, BaseModel) |
|
|
|
), f"Query parameter {param_name!r} must be one of the supported types" |
|
|
|
@ -755,11 +755,17 @@ def _get_multidict_value( |
|
|
|
value = values.getlist(alias) |
|
|
|
elif alias in values: |
|
|
|
value = values[alias] |
|
|
|
elif values and is_scalar_mapping_field(field) and isinstance(values, QueryParams): |
|
|
|
elif ( |
|
|
|
values |
|
|
|
and field_annotation_is_scalar_mapping_field(field.field_info.annotation) |
|
|
|
and isinstance(values, QueryParams) |
|
|
|
): |
|
|
|
value = dict(values) |
|
|
|
elif ( |
|
|
|
values |
|
|
|
and is_scalar_sequence_mapping_field(field) |
|
|
|
and field_annotation_is_scalar_sequence_mapping_field( |
|
|
|
field.field_info.annotation |
|
|
|
) |
|
|
|
and isinstance(values, QueryParams) |
|
|
|
): |
|
|
|
value = {key: values.getlist(key) for key in values.keys()} |
|
|
|
@ -868,7 +874,10 @@ def request_params_to_args( |
|
|
|
# specified as individual fields |
|
|
|
for field in fields: |
|
|
|
if isinstance(values.get(field.name), dict) and ( |
|
|
|
is_scalar_mapping_field(field) or is_scalar_sequence_mapping_field(field) |
|
|
|
field_annotation_is_scalar_mapping_field(field.field_info.annotation) |
|
|
|
or field_annotation_is_scalar_sequence_mapping_field( |
|
|
|
field.field_info.annotation |
|
|
|
) |
|
|
|
): |
|
|
|
for f_ in fields: |
|
|
|
values[field.name].pop(f_.alias, None) |
|
|
|
|