mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-10-04 01:10:36 +00:00
refactor(分页): 统一分页逻辑并设置默认值
将分页参数的默认值从 None 改为具体数值,简化分页处理逻辑 移除返回全部数据的逻辑,强制所有分页操作使用默认值 更新相关文档说明分页行为变化
This commit is contained in:
@@ -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
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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)}")
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user