39 lines
1.2 KiB
Markdown
39 lines
1.2 KiB
Markdown
# Pagination Patterns
|
|
|
|
**Offset-based and cursor-based pagination examples.**
|
|
|
|
## Offset-Based Pagination
|
|
|
|
```python
|
|
class PaginatedResponse[T](BaseModel):
|
|
items: list[T]
|
|
total: int
|
|
skip: int
|
|
limit: int
|
|
has_more: bool
|
|
|
|
@router.get("", response_model=PaginatedResponse[UserRead])
|
|
async def list_users(skip: int = 0, limit: int = 100):
|
|
repository = UserRepository(db, tenant_id=current_user.tenant_id)
|
|
users = await repository.list(skip=skip, limit=limit)
|
|
total = await repository.count()
|
|
return PaginatedResponse(items=users, total=total, skip=skip, limit=limit, has_more=(skip + limit) < total)
|
|
```
|
|
|
|
## Cursor-Based Pagination (Recommended)
|
|
|
|
```python
|
|
class CursorPaginatedResponse[T](BaseModel):
|
|
items: list[T]
|
|
next_cursor: Optional[str]
|
|
has_more: bool
|
|
|
|
@router.get("")
|
|
async def list_users(cursor: Optional[str] = None, limit: int = 100):
|
|
users = await repository.list_cursor(cursor=cursor, limit=limit)
|
|
next_cursor = users[-1].id if len(users) == limit else None
|
|
return CursorPaginatedResponse(items=users, next_cursor=next_cursor, has_more=next_cursor is not None)
|
|
```
|
|
|
|
**See also:** [fastapi-crud.md](fastapi-crud.md) for complete examples
|