查询钩子函数
概述
查询钩子函数允许您在模型管理类中自定义数据查询的处理逻辑。通过重写handle_query方法,您可以:
- 自定义查询条件
- 添加数据过滤
- 自定义排序逻辑
- 实现数据权限控制
基本用法
在您的模型管理类中重写handle_query方法:
class YourModelAdmin(ModelAdmin):
async def handle_query(self, request: Request, params: dict) -> tuple[QuerySet, int]:
"""
处理数据查询的钩子方法
Args:
request: Request对象
params: 查询参数字典,包含:
- limit: 每页记录数
- offset: 偏移量
- search: 搜索关键字
- sort: 排序字段
- order: 排序方式(asc/desc)
- 其他过滤参数
Returns:
tuple[QuerySet, int]: (查询结果集, 总记录数)
"""
try:
# 获取基础查询集
queryset = await self.get_queryset(request, params)
# 在这里可以添加自定义逻辑
# 例如:数据权限控制
if not request.user.is_superuser:
queryset = queryset.filter(owner=request.user)
# 自定义过滤条件
if params.get('status'):
queryset = queryset.filter(status=params['status'])
# 处理排序
if params.get('sort'):
order_by = f"{'-' if params['order'] == 'desc' else ''}{params['sort']}"
queryset = queryset.order_by(order_by)
elif self.default_ordering:
queryset = queryset.order_by(*self.default_ordering)
# 获取总记录数
total = await queryset.count()
# 分页
queryset = queryset.offset(params['offset']).limit(params['limit'])
return queryset, total
except Exception as e:
print(f"查询处理错误: {str(e)}")
return self.model.all(), 0
参数说明
request: Robyn的Request对象,包含当前请求的所有信息params: 查询参数字典,包含分页、排序、搜索等参数
返回值
该方法需要返回一个元组,包含:
QuerySet: 查询结果集int: 总记录数