fastapi-pagination icon indicating copy to clipboard operation
fastapi-pagination copied to clipboard

Option to return more than 100 rows

Open clarkgrubb opened this issue 1 year ago • 1 comments

Great package!

Is there a way to increase the max page size above 100? It looks like the max page size is hardcoded to 100 here:

https://github.com/uriyyo/fastapi-pagination/blob/main/fastapi_pagination/default.py#L41

If not, making it configurable in some way might be more efficient when returning small rows.

clarkgrubb avatar Aug 06 '24 17:08 clarkgrubb

Hi @clarkgrubb,

Sure, you can use CustomizedPage, here is an example:

from typing import TypeVar
from fastapi_pagination import Page
from fastapi_pagination.customization import CustomizedPage, UseParamsFields
from fastapi import Query

T = TypeVar("T")

CustomPage = CustomizedPage[
    Page[T],
    UseParamsFields(size=Query(le=200))
]

uriyyo avatar Aug 22 '24 21:08 uriyyo

Thanks for the response. It doesn't seem to work for me for some reason.

Here is my Page class:

ParkedDomainPage = CustomizedPage[
    Page[TypeVar('T')],
    UseName('ParkedDomainPage'),
    UseParamsFields(
        size=Query(le=500),
    ),
    UseFieldsAliases(
        items='parked_domains',
        size='per_page'),
    UseExcludedFields('total'),
]

Here is the error I get when I try to use it:

1725384117.973273 [error    ] validation_error               details=[{'message': 'Input should be less than or equal to 100', 'field': 'size', 'value': 500}] request_data={'url': URL('http://127.0.0.1:8000/v2/campaigns/domains?sort_by=created_at&sort_direction=asc&page=1&per_page=500'), 'query_params': QueryParams('sort_by=created_at&sort_direction=asc&page=1&per_page=500')}

Here is my endpoint signature:

@router.get('/domains',
            status_code=200,
            response_model=ParkedDomainPage[ParkedDomainSchema])
def get_parked_domains(
        db: db_dependency,
        request: Request,
        linkset: Union[List[str], None] = Query(None),
        parked_domain: Union[List[str], None] = Query(None),
        partner_id: Union[List[int], None] = Query(None),
        query: Union[str, None] = None,
        requestor: Union[List[str], None] = Query(None),
        status: Union[List[str], None] = Query(None),
        use_webhook: Union[bool, None] = None,
        sort_by: Union[str, None] = SORT_BY_ENUM[0],
        sort_direction: Union[str, None] = SORT_DIRECTION_ENUM[0],
        eu_domain: Union[bool, None] = None,
        caller: Union[str, None] = None,
        page: int = 1,
        per_page: int = 20):

clarkgrubb avatar Sep 03 '24 17:09 clarkgrubb

Hi @clarkgrubb,

Sorry, for long response. I guess we also need to add alias for size params field, here is an example:

from typing import TypeVar

from fastapi import FastAPI, Query

from fastapi_pagination import Page, add_pagination, paginate
from fastapi_pagination.customization import (
    CustomizedPage,
    UseExcludedFields,
    UseFieldsAliases,
    UseName,
    UseParamsFields,
)

app = FastAPI()
add_pagination(app)

T = TypeVar("T")

ParkedDomainPage = CustomizedPage[
    Page[T],
    UseName("ParkedDomainPage"),
    UseParamsFields(
        size=Query(
            le=500,
            alias="per_page",
        ),
    ),
    UseFieldsAliases(
        items="parked_domains",
        size="per_page",
    ),
    UseExcludedFields("total"),
]


@app.get("/items")
async def read_items() -> ParkedDomainPage[int]:
    return paginate([*range(1_000)])


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app)

uriyyo avatar Sep 08 '24 12:09 uriyyo

Hi @clarkgrubb,

I'm closing this issue, please reopen if this issue still exists on your side

uriyyo avatar Oct 01 '24 12:10 uriyyo