refactor(分页): 统一分页逻辑并设置默认值

将分页参数的默认值从 None 改为具体数值,简化分页处理逻辑
移除返回全部数据的逻辑,强制所有分页操作使用默认值
更新相关文档说明分页行为变化
This commit is contained in:
zhangtao
2025-11-26 23:45:40 +08:00
parent 6ccafb63ef
commit bd5ee45e8a
5 changed files with 22 additions and 27 deletions
@@ -62,8 +62,8 @@ async def get_obj_list_controller(
# 使用数据库分页而不是应用层分页 # 使用数据库分页而不是应用层分页
result_dict = await DemoService.page_service( result_dict = await DemoService.page_service(
auth=auth, auth=auth,
page_no=page.page_no if page.page_no is not None else 1, page_no=page.page_no,
page_size=page.page_size if page.page_size is not None else 10, page_size=page.page_size,
search=search, search=search,
order_by=page.order_by order_by=page.order_by
) )
+8 -12
View File
@@ -26,8 +26,8 @@ class PaginationService:
async def paginate(data_list: List[Any], page_no: Optional[int] = None, page_size: Optional[int] = None) -> Dict[str, Any]: async def paginate(data_list: List[Any], page_no: Optional[int] = None, page_size: Optional[int] = None) -> Dict[str, Any]:
""" """
分页数据处理。 分页数据处理。
输入数据列表和分页信息,返回分页或非分页数据列表结果。 输入数据列表和分页信息,返回分页数据列表结果。
未传入 page_no 和 page_size 时,返回全部数据。 未传入 page_no 和 page_size 时,使用默认值进行分页。
参数: 参数:
- data_list (List[Any]): 原始数据列表。 - data_list (List[Any]): 原始数据列表。
@@ -35,22 +35,18 @@ class PaginationService:
- page_size (int | None): 每页数据量,默认 None。 - page_size (int | None): 每页数据量,默认 None。
返回: 返回:
- Dict[str, Any]: 分页或非分页数据对象。 - Dict[str, Any]: 分页数据对象。
异常: 异常:
- CustomException: 当分页参数不合法时抛出。 - CustomException: 当分页参数不合法时抛出。
""" """
total = len(data_list) total = len(data_list)
# 如果page_no和page_size都为None,返回全部数据 # 设置默认值
if page_no is None or page_size is None: if page_no is None:
return { page_no = 1
"items": data_list, if page_size is None:
"total": total, page_size = 10
"page_no": None,
"page_size": None,
"has_next": False
}
# 验证分页参数 # 验证分页参数
if page_no < 1 or page_size < 1: if page_no < 1 or page_size < 1:
+9 -9
View File
@@ -7,6 +7,8 @@ from sqlalchemy.orm import selectinload
from sqlalchemy.engine import Result from sqlalchemy.engine import Result
from sqlalchemy import asc, func, select, delete, Select, desc, update, or_, and_ from sqlalchemy import asc, func, select, delete, Select, desc, update, or_, and_
from sqlalchemy import inspect as sa_inspect from sqlalchemy import inspect as sa_inspect
from fastapi_pagination import Page, add_pagination, Params
from fastapi_pagination.ext.sqlalchemy import paginate as pagination_paginate
from app.core.base_model import MappedBase from app.core.base_model import MappedBase
from app.core.exceptions import CustomException from app.core.exceptions import CustomException
@@ -175,15 +177,13 @@ class CRUDBase(Generic[ModelType, CreateSchemaType, UpdateSchemaType]):
result: Result = await self.db.execute(sql.offset(offset).limit(limit)) result: Result = await self.db.execute(sql.offset(offset).limit(limit))
objs = result.scalars().all() objs = result.scalars().all()
data = PageResultSchema( return {
items=[out_schema.model_validate(obj).model_dump() for obj in objs], "page_no": offset // limit + 1 if limit else 1,
total=total, "page_size": limit if limit else 10,
page_no=offset // limit + 1 if limit else 1, "total": total,
page_size=limit, "has_next": offset + limit < total,
has_next=offset + limit < total, "items": [out_schema.model_validate(obj).model_dump() for obj in objs]
).model_dump() }
return data
except Exception as e: except Exception as e:
raise CustomException(msg=f"分页查询失败: {str(e)}") raise CustomException(msg=f"分页查询失败: {str(e)}")
+2 -2
View File
@@ -9,8 +9,8 @@ class PaginationQueryParam:
def __init__( def __init__(
self, self,
page_no: Optional[int] = Query(default=None, description="当前页码", ge=1), page_no: Optional[int] = Query(default=1, description="当前页码", ge=1),
page_size: Optional[int] = Query(default=None, description="每页数量", ge=1, le=100), page_size: Optional[int] = Query(default=10, description="每页数量", ge=1, le=100),
order_by: Optional[str] = Query(default=None, description="排序字段,格式:field1,asc;field2,desc"), order_by: Optional[str] = Query(default=None, description="排序字段,格式:field1,asc;field2,desc"),
) -> None: ) -> None:
""" """
+1 -2
View File
@@ -34,8 +34,7 @@ rich==13.9.4 # 终端打印美化
sqlglot[rs]==27.8.0 # sql 解析 sqlglot[rs]==27.8.0 # sql 解析
pydantic_validation_decorator==0.1.4 # 模型验证 pydantic_validation_decorator==0.1.4 # 模型验证
loguru==0.7.3 loguru==0.7.3
fastapi-limiter==0.1.6
# amqp==5.3.1 # amqp==5.3.1
fastapi-limiter==0.1.6
# fastapi-pagination==0.15.0
# python-socketio==5.14.3 # python-socketio==5.14.3