1. 程式人生 > >寫介面 :將資料庫查詢的QuerySet集合轉化成json資料

寫介面 :將資料庫查詢的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