|
37 | 37 | lenient_issubclass, |
38 | 38 | ) |
39 | 39 | from fastapi.routing import APIRoute, APIRouter |
| 40 | +from pydantic import BaseModel |
40 | 41 |
|
41 | 42 | from .bases import AbstractPage, AbstractParams |
42 | 43 | from .default import Page |
43 | 44 | from .types import AsyncItemsTransformer, ItemsTransformer, SyncItemsTransformer |
44 | | -from .utils import is_async_callable |
| 45 | +from .utils import IS_PYDANTIC_V2, is_async_callable |
45 | 46 |
|
46 | 47 | T = TypeVar("T") |
47 | 48 | TAbstractParams = TypeVar("TAbstractParams", covariant=True, bound=AbstractParams) |
@@ -245,7 +246,18 @@ async def _pagination_params(*args: Any, **kwargs: Any) -> AsyncIterator[TAbstra |
245 | 246 | with _ctx_var_with_reset(_params_val, cast(AbstractParams, val)): |
246 | 247 | yield val |
247 | 248 |
|
248 | | - _pagination_params.__signature__ = inspect.signature(params) # type: ignore[attr-defined] |
| 249 | + sign = inspect.signature(params) |
| 250 | + |
| 251 | + if IS_PYDANTIC_V2: |
| 252 | + with suppress(ValueError, TypeError): |
| 253 | + if issubclass(params, BaseModel): |
| 254 | + sign_params = {**sign.parameters} |
| 255 | + for name, field in params.model_fields.items(): |
| 256 | + sign_params[name] = sign_params[name].replace(default=field) |
| 257 | + |
| 258 | + sign = sign.replace(parameters=[*sign_params.values()]) |
| 259 | + |
| 260 | + _pagination_params.__signature__ = sign # type: ignore[attr-defined] |
249 | 261 |
|
250 | 262 | return _pagination_params |
251 | 263 |
|
|
0 commit comments