This commit is contained in:
JONEMI21 2026-01-27 15:58:38 +00:00
parent 1270b764bf
commit c543be18f0
5 changed files with 16 additions and 24 deletions

View File

@ -1,4 +1,4 @@
from typing import Annotated, Dict, List
from typing import Annotated
from fastapi import FastAPI, Query
@ -8,9 +8,9 @@ app = FastAPI()
@app.get("/query/mixed-type-params")
def get_mixed_mapping_mixed_type_query_params(
query: Annotated[int, Query()] = None,
mapping_query_str: Annotated[Dict[str, str], Query()] = None,
mapping_query_int: Annotated[Dict[str, int], Query()] = None,
sequence_mapping_int: Annotated[Dict[str, List[int]], Query()] = None,
mapping_query_str: Annotated[dict[str, str], Query()] = None,
mapping_query_int: Annotated[dict[str, int], Query()] = None,
sequence_mapping_int: Annotated[dict[str, list[int]], Query()] = None,
):
return {
"query": query,

View File

@ -2,14 +2,14 @@ from .shared import PYDANTIC_V2 as PYDANTIC_V2
from .shared import PYDANTIC_VERSION_MINOR_TUPLE as PYDANTIC_VERSION_MINOR_TUPLE
from .shared import annotation_is_pydantic_v1 as annotation_is_pydantic_v1
from .shared import field_annotation_is_scalar as field_annotation_is_scalar
from .shared import is_pydantic_v1_model_class as is_pydantic_v1_model_class
from .shared import is_pydantic_v1_model_instance as is_pydantic_v1_model_instance
from .shared import (
field_annotation_is_scalar_mapping as field_annotation_is_scalar_mapping,
)
from .shared import (
field_annotation_is_scalar_sequence_mapping as field_annotation_is_scalar_sequence_mapping,
)
from .shared import is_pydantic_v1_model_class as is_pydantic_v1_model_class
from .shared import is_pydantic_v1_model_instance as is_pydantic_v1_model_instance
from .shared import (
is_uploadfile_or_nonable_uploadfile_annotation as is_uploadfile_or_nonable_uploadfile_annotation,
)
@ -39,11 +39,12 @@ from .v2 import get_schema_from_model_field as get_schema_from_model_field
from .v2 import is_bytes_field as is_bytes_field
from .v2 import is_bytes_sequence_field as is_bytes_sequence_field
from .v2 import is_scalar_field as is_scalar_field
from .v2 import is_scalar_mapping_field as is_scalar_mapping_field
from .v2 import is_scalar_sequence_field as is_scalar_sequence_field
from .v2 import is_scalar_sequence_mapping_field as is_scalar_sequence_mapping_field
from .v2 import is_sequence_field as is_sequence_field
from .v2 import omit_by_default as omit_by_default
from .v2 import serialize_sequence_value as serialize_sequence_value
from .v2 import (
with_info_plain_validator_function as with_info_plain_validator_function,
)
from .v2 import is_scalar_mapping_field as is_scalar_mapping_field
from .v2 import is_scalar_sequence_mapping_field as is_scalar_sequence_mapping_field

View File

@ -5,12 +5,7 @@ from copy import copy, deepcopy
from dataclasses import dataclass, is_dataclass
from enum import Enum
from functools import lru_cache
from typing import (
Annotated,
Any,
Union,
cast,
)
from typing import Annotated, Any, Callable, Union, cast
from fastapi._compat import shared
from fastapi.openapi.constants import REF_TEMPLATE

View File

@ -26,6 +26,8 @@ from fastapi._compat import (
create_body_model,
evaluate_forwardref,
field_annotation_is_scalar,
field_annotation_is_scalar_mapping,
field_annotation_is_scalar_sequence_mapping,
get_cached_model_fields,
get_missing_field_error,
is_bytes_field,
@ -38,11 +40,10 @@ from fastapi._compat import (
is_uploadfile_or_nonable_uploadfile_annotation,
is_uploadfile_sequence_annotation,
lenient_issubclass,
omit_by_default,
sequence_types,
serialize_sequence_value,
value_is_sequence,
field_annotation_is_scalar_mapping,
field_annotation_is_scalar_sequence_mapping,
)
from fastapi.background import BackgroundTasks
from fastapi.concurrency import (
@ -505,8 +506,8 @@ def analyze_param(
field_info.alias = alias
# Omit by default for scalar mapping and scalar sequence mapping query fields
class_validators: Dict[str, Callable[..., Any]] = {}
if isinstance(field_info, (params.Query, temp_pydantic_v1_params.Query)) and (
class_validators: dict[str, Callable[..., Any]] = {}
if isinstance(field_info, params.Query) and (
field_annotation_is_scalar_sequence_mapping(use_annotation_from_field_info)
or field_annotation_is_scalar_mapping(use_annotation_from_field_info)
):
@ -727,10 +728,6 @@ def _validate_value_with_model_field(
return deepcopy(field.default), []
v_, errors_ = field.validate(value, values, loc=loc)
if _is_error_wrapper(errors_): # type: ignore[arg-type]
return None, [errors_]
elif isinstance(errors_, list):
new_errors = may_v1._regenerate_error_with_loc(errors=errors_, loc_prefix=())
if isinstance(errors_, list):
new_errors = _regenerate_error_with_loc(errors=errors_, loc_prefix=())
return None, new_errors

View File

@ -1,4 +1,3 @@
from typing import Dict, List
import pytest
from fastapi import FastAPI, Query
@ -9,5 +8,5 @@ def test_invalid_sequence():
app = FastAPI()
@app.get("/items/")
def read_items(q: Dict[str, List[List[str]]] = Query(default=None)):
def read_items(q: dict[str, list[list[str]]] = Query(default=None)):
pass # pragma: no cover