From 434306d9f15c8addf266665ed5e53d8d1eff6784 Mon Sep 17 00:00:00 2001 From: d3vyce Date: Sun, 22 Mar 2026 18:38:01 -0400 Subject: [PATCH] update fastapi pagination article --- .../index.md | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/content/posts/how-to-implement-pagination-sorting-and-filtering-with-fastapi/index.md b/content/posts/how-to-implement-pagination-sorting-and-filtering-with-fastapi/index.md index 0b1ddf6..f1166e4 100644 --- a/content/posts/how-to-implement-pagination-sorting-and-filtering-with-fastapi/index.md +++ b/content/posts/how-to-implement-pagination-sorting-and-filtering-with-fastapi/index.md @@ -206,19 +206,20 @@ With the CRUD factory declared, routes become thin wrappers. Each route uses [Ar @router.get("/offset") async def list_articles_offset( session: SessionDep, + params: Annotated[ + dict[str, Any], + Depends(ArticleCrud.offset_params(default_page_size=20, max_page_size=100)), + ], filter_by: Annotated[dict[str, list[str]], Depends(ArticleCrud.filter_params())], order_by: Annotated[ OrderByClause | None, Depends(ArticleCrud.order_params(default_field=Article.created_at)), ], - page: int = Query(1, ge=1), - items_per_page: int = Query(20, ge=1, le=100), search: str | None = None, ) -> OffsetPaginatedResponse[ArticleRead]: return await ArticleCrud.offset_paginate( session=session, - page=page, - items_per_page=items_per_page, + **params, search=search, filter_by=filter_by or None, order_by=order_by, @@ -274,19 +275,20 @@ GET /articles/offset?page=2&items_per_page=2&search=fastapi&filter_by[status]=pu @router.get("/cursor") async def list_articles_cursor( session: SessionDep, + params: Annotated[ + dict[str, Any], + Depends(ArticleCrud.cursor_params(default_page_size=20, max_page_size=100)), + ], filter_by: Annotated[dict[str, list[str]], Depends(ArticleCrud.filter_params())], order_by: Annotated[ OrderByClause | None, Depends(ArticleCrud.order_params(default_field=Article.created_at)), ], - cursor: str | None = None, - items_per_page: int = Query(20, ge=1, le=100), search: str | None = None, ) -> CursorPaginatedResponse[ArticleRead]: return await ArticleCrud.cursor_paginate( session=session, - cursor=cursor, - items_per_page=items_per_page, + **params, search=search, filter_by=filter_by or None, order_by=order_by, @@ -349,23 +351,20 @@ You can also expose a single endpoint that supports both strategies via a `pagin @router.get("/") async def list_articles( session: SessionDep, + params: Annotated[ + dict[str, Any], + Depends(ArticleCrud.paginate_params(default_page_size=20, max_page_size=100)), + ], filter_by: Annotated[dict[str, list[str]], Depends(ArticleCrud.filter_params())], order_by: Annotated[ OrderByClause | None, Depends(ArticleCrud.order_params(default_field=Article.created_at)), ], - pagination_type: PaginationType = PaginationType.OFFSET, - page: int = Query(1, ge=1), - cursor: str | None = None, - items_per_page: int = Query(20, ge=1, le=100), search: str | None = None, ) -> PaginatedResponse[ArticleRead]: return await ArticleCrud.paginate( session, - pagination_type=pagination_type, - page=page, - cursor=cursor, - items_per_page=items_per_page, + **params, search=search, filter_by=filter_by or None, order_by=order_by,