写接口 :将数据库查询的QuerySet集合转化成json数据

希望在请求结果中包含这一个资源的详细信息的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

猜你喜欢

转载自blog.csdn.net/zhangmengran/article/details/84780083