|
9 | 9 |
|
10 | 10 | from asgiref.sync import sync_to_async
|
11 | 11 | from django.http import HttpRequest
|
12 |
| -from ninja.pagination import PaginationBase |
| 12 | +from ninja.pagination import AsyncPaginationBase, PaginationBase |
13 | 13 |
|
14 | 14 | from ninja_extra.context import RouteContext
|
15 | 15 | from ninja_extra.shortcuts import add_ninja_contribute_args
|
16 | 16 |
|
17 | 17 | if TYPE_CHECKING: # pragma: no cover
|
18 | 18 | from ninja_extra.controllers import ControllerBase
|
19 | 19 |
|
| 20 | +import django |
| 21 | + |
20 | 22 |
|
21 | 23 | class PaginatorOperation:
|
22 | 24 | def __init__(
|
23 | 25 | self,
|
24 | 26 | *,
|
25 |
| - paginator: PaginationBase, |
| 27 | + paginator: Union[PaginationBase, AsyncPaginationBase], |
26 | 28 | view_func: Callable,
|
27 | 29 | paginator_kwargs_name: str = "pagination",
|
28 | 30 | ) -> None:
|
@@ -110,8 +112,12 @@ async def as_view(
|
110 | 112 | request = request_or_controller
|
111 | 113 | params = dict(kw)
|
112 | 114 | params["request"] = request
|
113 |
| - paginate_queryset = cast( |
114 |
| - Callable, sync_to_async(self.paginator.paginate_queryset) |
| 115 | + is_supported_async_orm = django.VERSION >= (4, 2) |
| 116 | + paginate_queryset = ( |
| 117 | + self.paginator.apaginate_queryset |
| 118 | + if isinstance(self.paginator, AsyncPaginationBase) |
| 119 | + and is_supported_async_orm |
| 120 | + else cast(Callable, sync_to_async(self.paginator.paginate_queryset)) |
115 | 121 | )
|
116 | 122 | return await paginate_queryset(items, **params)
|
117 | 123 |
|
|
0 commit comments