30 lines
687 B
Python
30 lines
687 B
Python
"""
|
||
通用分页:offset/limit 参数与分页结果结构。
|
||
各 feature 的 router 按需使用,成功响应直接返回 Pydantic model,不强制包装。
|
||
"""
|
||
|
||
from typing import Generic, TypeVar
|
||
|
||
from pydantic import BaseModel
|
||
|
||
T = TypeVar("T")
|
||
|
||
|
||
class PageParams(BaseModel):
|
||
"""常用分页查询参数(router 中通过 Depends 注入)。"""
|
||
|
||
offset: int = 0
|
||
limit: int = 20
|
||
|
||
def clamp_limit(self, max_limit: int = 100) -> int:
|
||
return min(max(1, self.limit), max_limit)
|
||
|
||
|
||
class Page(BaseModel, Generic[T]):
|
||
"""分页结果:items + total(可选)。"""
|
||
|
||
items: list[T]
|
||
total: int | None = None
|
||
offset: int = 0
|
||
limit: int = 20
|