DRF過(guò)濾排序分頁(yè)異常處理的過(guò)程記錄
一、過(guò)濾
對(duì)于列表數(shù)據(jù)要通過(guò)字段來(lái)進(jìn)行過(guò)濾,就需要添加 django-filter 模塊
使用方法:
# 1、注冊(cè),在app中注冊(cè) settings.py INSTALLED_APPS = [ 'django_filters', ] # 2、settings.py 配置 REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': ( 'django_filters.rest_framework.DjangoFilterBackend', ) } # 3、在視圖中添加filter_fields屬性,指定過(guò)濾的字段 class BooksView(ModelViewSet): queryset = Books.objects.all() serializer_class = BooksSerializer filter_fields = ('title',) # 配置可以按照哪個(gè)字段來(lái)過(guò)濾 # http://127.0.0.1:8000/books/?title=紅樓夢(mèng)
二、排序
排序可以使用 Rest Framework 提供的 OrderingFilter 來(lái)快速指明數(shù)據(jù)按指定字段進(jìn)行排序
使用方法:
# 1、首先視圖中設(shè)置filter_backends=[OrderingFilter] # 2、然后再視圖中添加 ordering_fields 屬性,指定排序字段 from rest_framework.filters import OrderingFilter class BooksView(ModelViewSet): queryset = Books.objects.all() serializer_class = BooksSerializer filter_backends = [OrderingFilter] # 第一步 ordering_fields = ['price','id'] # 第二步 # http://127.0.0.1:8000/books/?ordering=id 通過(guò)ordering查看有無(wú)指明排序的字段,并通過(guò)字段來(lái)排序 # -id 表示針對(duì)id字段進(jìn)行倒序排序 # id 表示針對(duì)id字段進(jìn)行升序排序
三、分頁(yè)
首先 Rest Framework 提供了三種分頁(yè)方式,并且
- PageNumberPagination
- LimitOffsetPagination
- CursorPagination
使用方式一:可以直接繼承使用,但是配置參數(shù)需要在settings.py里面配置
使用方式二:通過(guò)子類繼承父類分頁(yè)器使用,直接在子類中修改父類的參數(shù)(推薦)
PageNumberPagination
子類中的屬性:
- page_size:每頁(yè)數(shù)目
- page_query_param:前端發(fā)送的頁(yè)數(shù)關(guān)鍵字,默認(rèn)“page”
- page_size_query_param:前端發(fā)送每頁(yè)數(shù)目關(guān)鍵字名,默認(rèn)None
- max_page_size:前端最多能設(shè)置的每頁(yè)數(shù)量
如何使用:
from rest_framework.generics import ListAPIView from rest_framework.pagination import PageNumberPagination from app01.models import Books from app01.ser import BooksSerializer # 第一步: class BookPageNumberPagination(PageNumberPagination): page_size = 3 # 每頁(yè)條數(shù) page_query_param = 'page' # 查詢第幾頁(yè)的key page_size_query_param = 'size' # 每一頁(yè)顯示的條數(shù) max_page_size = 5 # 每頁(yè)最大條數(shù) class BookView(ListAPIView): queryset = Books.objects.all() serializer_class = BooksSerializer # 第二步:分頁(yè)配置 pagination_class = BookPageNumberPagination # url:http://127.0.0.1:8000/books/?page=1&size=5 查詢第1頁(yè),一共顯示五條數(shù)據(jù)
LimitOffsetPagination
子類中的屬性:
- default_limit:默認(rèn)限制,默認(rèn)值與PAGE_SIZE設(shè)置一致
- limit_query_param:limit參數(shù)名,默認(rèn)'limit'
- offset_query_param:offset參數(shù)名,默認(rèn)'offset'
- max_limit:最大limit限制,默認(rèn)None
如何使用:
from rest_framework.generics import ListAPIView from rest_framework.pagination import LimitOffsetPagination from app01.models import Books from app01.ser import BooksSerializer # 第一步: class BookLimitOffsetPagination(LimitOffsetPagination): default_limit = 3 # 每頁(yè)條數(shù) limit_query_param = 'limit' # 往后拿幾條 offset_query_param = 'offset' # 從第幾條往后拿幾條的標(biāo)桿 max_limit = 5 # 每頁(yè)最大拿幾條 class BookView(ListAPIView): queryset = Books.objects.all() serializer_class = BooksSerializer # 第二步:分頁(yè)配置 pagination_class = BookLimitOffsetPagination # url:http://127.0.0.1:8000/books/?limit=3&offset=4 從第三條開(kāi)始往后拿4條數(shù)據(jù)
CursorPagination
子類中的屬性:
- cursor_query_param:默認(rèn)查詢字段,不需要修改
- page_size:每頁(yè)數(shù)目
- ordering:按什么排序,需要指定
如何使用:
CursorPagination的查詢速度快,但是卻不能定位到第幾頁(yè)這樣查,要么往前查,要么往后查。
from rest_framework.generics import ListAPIView from rest_framework.pagination import CursorPagination from app01.models import Books from app01.ser import BooksSerializer # 第一步: class BookCursorPagination(CursorPagination): cursor_query_param = 'cursor' # 每頁(yè)查詢的key page_size = 3 # 每頁(yè)顯示條數(shù) ordering = 'id' # 排序字段 class BookView(ListAPIView): queryset = Books.objects.all() serializer_class = BooksSerializer # 第二步:分頁(yè)配置 pagination_class = BookCursorPagination # url:http://127.0.0.1:8000/books/?cursor=cD0z
繼承APIView使用方法
像方式一,方式二這樣使用的話,就要視圖類是繼承 ListAPIView 然后直接配置就可以了
但是如果視圖類繼承的是 GenericAPIView 或者 APIView 的話,就需要用另一種方式了:
使用方法:
# 1、定義一個(gè)分頁(yè)器 class BookPageNumberPagination(PageNumberPagination): page_size = 3 # 每頁(yè)條數(shù) page_query_param = 'page' # 查詢第幾頁(yè)的key page_size_query_param = 'size' # 每一頁(yè)顯示的條數(shù) max_page_size = 5 # 每頁(yè)最大條數(shù) class BookView(APIView): def get(self, request, *args, **kwargs): book_list = Books.objects.all() # 2、實(shí)例化得到一個(gè)分頁(yè)器對(duì)象 page_obj = BookPageNumberPagination() # 3、調(diào)用paginate_queryset返回每一頁(yè)的數(shù)據(jù) book_list = page_obj.paginate_queryset(book_list, request, view=self) # 4、獲取上一頁(yè)下一頁(yè)鏈接 next_url = page_obj.get_next_link() previous_url = page_obj.get_previous_link() # 5、序列化 book_ser = BooksSerializer(book_list, many=True) # 6、加入響應(yīng)信息中 data = {'next_url': next_url, 'previous_url': previous_url, 'data': book_ser.data} return Response(data=data)
四、異常處理
異常處理主要是用來(lái)統(tǒng)一接口返回
源碼分析
異常處理在APIView的api_settings已經(jīng)配置好了
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
def exception_handler(exc, context): # 先判斷是不是404 if isinstance(exc, Http404): # exc是異常信息的異常對(duì)象 exc = exceptions.NotFound() # 然后判斷是不是權(quán)限的問(wèn)題 elif isinstance(exc, PermissionDenied): exc = exceptions.PermissionDenied() # 比如權(quán)限問(wèn)題會(huì)返回一個(gè)字典 # 在判斷你拋出的是不是API的異?!?gt;認(rèn)證權(quán)限這些都是繼承了API的異常 if isinstance(exc, exceptions.APIException): headers = {} if getattr(exc, 'auth_header', None): headers['WWW-Authenticate'] = exc.auth_header if getattr(exc, 'wait', None): headers['Retry-After'] = '%d' % exc.wait if isinstance(exc.detail, (list, dict)): data = exc.detail else: data = {'detail': exc.detail} set_rollback() return Response(data, status=exc.status_code, headers=headers) # 只要是上面這些異常都做了處理 return None # 意味有些異常它沒(méi)有處理,就會(huì)交給Django自己處理
如何處理
因?yàn)閐ir有些異常它不做處理,Django處理的又不符合我們的標(biāo)準(zhǔn),所以就要寫一個(gè)統(tǒng)一的異常類來(lái)替換掉它,把所有情況都處理,只要前端出異??吹降亩际枪潭ǖ臇|西。
如何寫:
重寫一個(gè)類,和它基本上差不多,配置的時(shí)候在 settings.py 里面全局配置
# app01_auth.py from rest_framework.views import exception_handler from rest_framework.response import Response def app01_exception_handler(exc, context): response = exception_handler(exc, context) # 原來(lái)的drf處理的我們也需要 # 兩種情況,一個(gè)是None,drf沒(méi)有處理,Django處理了,但是處理的不符合需求 # response對(duì)象,drf處理了我們需要的 if not response: # 如果沒(méi)處理,那么我們自己處理 return Response(data={'status': 400, 'error': str(exc)}, status=400) else: # drf 處理了,那么取出它處理的信息,重新處理一下 return Response(data={'status': 400, 'error': response.data.get('detail')}, status=400)
然后再全局配置一下:settings.py
REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'app01.app_auth.app01_exception_handler', }
五、封裝Response對(duì)象
class APIResponse(Response): def __init__(self,code=100,msg='成功',data=None,status=None,headers=None,**kwargs): dic = {'code': code, 'msg': msg} if data: dic = {'code': code, 'msg': msg,'data':data} dic.update(kwargs) super().__init__(data=dic, status=status,headers=headers) # 使用 return APIResponse(data={"name":'xiaoyang'},token='dsafsdfa',aa='dsafdsfdee') return APIResponse(data={"name":'xiaoyang'}) return APIResponse(code='101',msg='錯(cuò)誤',data={"name":'xiaoyang'},token='dsafsdfa',aa='dsafdsfdee',header={})
總結(jié)
到此這篇關(guān)于DRF過(guò)濾排序分頁(yè)異常處理的文章就介紹到這了,更多相關(guān)DRF過(guò)濾排序分頁(yè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)的邏輯回歸算法示例【附測(cè)試csv文件下載】
這篇文章主要介紹了Python實(shí)現(xiàn)的邏輯回歸算法,結(jié)合具體實(shí)例形式分析了Python邏輯回歸算法相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-12-12GitHub?AI編程工具copilot在Pycharm的應(yīng)用
最近聽(tīng)說(shuō)github出了一種最新的插件叫做copilot,這篇文章主要給大家介紹了關(guān)于GitHub?AI編程工具copilot在Pycharm的應(yīng)用,目前感覺(jué)確實(shí)不錯(cuò),建議大家也去使用,需要的朋友可以參考下2022-04-04讓python的Cookie.py模塊支持冒號(hào)做key的方法
雖然Cookie的標(biāo)準(zhǔn)是不允許:冒號(hào)出現(xiàn)在key里面的,但是我們的開(kāi)發(fā)人員是很可愛(ài)的,常常會(huì)讓我們意想不到。2010-12-12Python使用pickle模塊實(shí)現(xiàn)序列化功能示例
這篇文章主要介紹了Python使用pickle模塊實(shí)現(xiàn)序列化功能,結(jié)合實(shí)例形式分析了基于pickle模塊的序列化操作相關(guān)操作技巧,需要的朋友可以參考下2018-07-07Python批量刪除mysql中千萬(wàn)級(jí)大量數(shù)據(jù)的腳本分享
這篇文章主要介紹了Python批量刪除mysql中千萬(wàn)級(jí)大量數(shù)據(jù)的示例代碼,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12python?random模塊常用函數(shù)基礎(chǔ)教程
這篇文章主要為大家介紹了python?random模塊常用函數(shù)基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06安裝pyecharts1.8.0版本后導(dǎo)入pyecharts模塊繪圖時(shí)報(bào)錯(cuò): “所有圖表類型將在 v1.9.0 版本開(kāi)始
這篇文章主要介紹了安裝pyecharts1.8.0版本后導(dǎo)入pyecharts模塊繪圖時(shí)報(bào)錯(cuò): “所有圖表類型將在 v1.9.0 版本開(kāi)始強(qiáng)制使用 ChartItem 進(jìn)行數(shù)據(jù)項(xiàng)配置 ”的解決方法,需要的朋友可以參考下2020-08-08Python實(shí)現(xiàn)微信好友數(shù)據(jù)爬取及分析
這篇文章會(huì)基于Python對(duì)微信好友進(jìn)行數(shù)據(jù)分析,這里選擇的維度主要有:性別、頭像、簽名、位置,主要采用圖表和詞云兩種形式來(lái)呈現(xiàn)結(jié)果,其中,對(duì)文本類信息會(huì)采用詞頻分析和情感分析兩種方法,感興趣的小伙伴可以了解一下2021-12-12