希望在请求结果中包含这一个资源的详细信息的api。
比如,我们请求商品列表信息得到如下的结果:
[
{
“id”: 1,
“name”: “袜子”
},
{
“id”: 2,
“name”: “裤子”
},
{
“id”: 3,
“name”: “鞋子”
}
]
但是,我们通过ORM进行objects.all()得到的是QuerySet集合,那么前端是无法进行解析的,我们需要返回json的格式的数据,例如上面的格式
那么,我们需要写一个工具,将QuerySet转化成json格式。
在项目下,创建一个包utils,包下创建一个orm_to_json.py文件
from django.db.models.query import QuerySet
def object_to_json(model, ignore=None):
'''
函数的作用就是将ORM中的Model对象,转化成json对象,再返回给前端
:param model:
:param ignore:
:return:
'''
if ignore is None:
ignore = []
if type(model) in [QuerySet, list]:
json = []
for element in model:
json.append(_django_single_object_to_json(element, ignore))
return json
else:
return _django_single_object_to_json(model, ignore)
def _django_single_object_to_json(element, ignore=None):
return dict([(attr, getattr(element, attr)) for attr in [f.name for f in element._meta.fields if f not in ignore]])
写好了将ORM中的Model对象,转化成json对象的函数
之后,urls.py
path('students/',StudentView.as_view()),
views.py中进行将QuerySet进行转换即可:object_to_json(stus),
class StudentView(View):
@method_decorator(allow_origin)
def get(self,request):
'''
学生数据查询接口
功能:分页返回学生数据,前端传递page=1就返回第一页的数据;
?page:页码
?size:每页的数据个数
:return:
'''
error = ''
# 1.查询所有的学生数据
stus = StuModel.objects.all()
# 2.根据前端ajax传递的page&size参数开始做分页数据
size = int(request.GET.get('size','2'))
page_number = int(request.GET.get('page','1'))
paginator = Paginator(stus,size)
try:
page = paginator.page(page_number)
except(EmptyPage,PageNotAnInteger,InvalidPage):
error = '已经是最后一页了'
page = paginator.page(paginator.num_pages)
page_number = paginator.num_pages
# 3.开始做分页
# 假设分页器上只显示5个页码,分页器出现滚动之后,当前页始终在中间,当前页前后各两个页码
if paginator.num_pages<=5:
# 全部展示,将当前所有页码的值返回给前端
page_nums = [x for x in range(1,paginator.num_pages+1)]
elif page_number < 4:
# 如果总页数超过5页了,但是当前页码小于4的时候,分页器是同样不会滚动的
page_nums = [x for x in range(1,6)]
elif page_number - 4>=0 and page_number<=paginator.num_pages -2:
page_nums = [x for x in range(page_number - 2, page_number + 3)]
else:
# 超过5页,但是已经到最后一页了,页面不再滚动
page_nums = [x for x in range(paginator.num_pages-4,paginator.num_pages+1)]
# 4.向前端返回json数据
previous = page.has_previous()
next = page.has_next()
data = {
'code':100,
'status':'ok',
'error':error,
# 总的数据个数
'total_pages':len(stus),
# 是否有上一页
'has_previous':previous,
'previous_url':page_number-1 if previous else None,
# 是否有下一页
'has_next':next,
'next_url':page_number+1 if next else None,
'page_nums':page_nums,
# 当前页的数据列表
'results':object_to_json(page.object_list),
'current_page':page_number
}
response = JsonResponse(data)
# # 允许所有的源,向这个接口发送请求并得到响应。(改变浏览器默认的禁止跨域,此时就是允许跨域)
response['Access-Control-Allow-Origin'] = '*'
return response