寫介面 :將資料庫查詢的QuerySet集合轉化成json資料
阿新 • • 發佈:2018-12-26
希望在請求結果中包含這一個資源的詳細資訊的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