如何在Django的自定义json_response函数中实现分页功能
自定义json_response函数添加分页功能实现方案
核心思路
- 为函数新增分页相关可选参数,默认设为
None,不改变原有无分页场景的调用逻辑 - 仅当分页参数有效时,在返回结构中新增
pagination字段存储分页元数据,避免冗余字段 - 可扩展适配Django/DRF自带分页对象,自动提取分页信息减少手动传参成本
- 优化原有代码中冗余的
json.dumps逻辑:JsonResponse本身会自动序列化Python对象,额外dumps会导致data字段返回字符串而非JSON对象,不符合常规接口设计规范
修改后的完整代码
import json from django.http import JsonResponse def json_response(data = {}, message = 'successful!', status = 'success', code = 200, page=None, page_size=None, total=None): data_set = {} status = 'success' if code == 200 else 'error' # 自动适配Django/DRF分页对象,优先从分页对象提取分页参数 if hasattr(data, 'paginator'): page = data.number page_size = data.paginator.per_page total = data.paginator.count # 提取分页后的实际数据 data = list(data) data_set['code'] = code data_set['status'] = status data_set['message'] = message if status == 'success': # 处理数据字段 try: data_set['data'] = data.data except AttributeError: data_set['data'] = data # 存在有效分页参数时添加分页元数据 if all([page, page_size, total]): total_pages = (total + page_size - 1) // page_size data_set['pagination'] = { 'page': page, 'page_size': page_size, 'total': total, 'total_pages': total_pages } return JsonResponse(data_set, safe=False, status=code)
使用示例
- 无分页场景,原有调用逻辑完全兼容:
return json_response(data={"name": "test"}, message="查询成功")
- 手动传入分页参数场景:
# 假设已经手动分页得到当前页的数据user_list,总条数为100 return json_response(data=user_list, page=2, page_size=10, total=100, message="查询成功")
- 适配Django ORM分页场景:
from django.core.paginator import Paginator user_queryset = User.objects.all() paginator = Paginator(user_queryset, 10) page_data = paginator.page(2) return json_response(data=page_data, message="查询成功")
内容的提问来源于stack exchange,提问作者chr0s3
相关产品推荐
相关产品推荐

