亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁(yè) > 知識(shí)庫(kù) > DRF過(guò)濾排序分頁(yè)異常處理的過(guò)程記錄

DRF過(guò)濾排序分頁(yè)異常處理的過(guò)程記錄

熱門標(biāo)簽:企業(yè)彩鈴地圖標(biāo)注 上海正規(guī)的外呼系統(tǒng)最新報(bào)價(jià) 如何地圖標(biāo)注公司 煙臺(tái)電話外呼營(yíng)銷系統(tǒng) 電銷機(jī)器人錄音要學(xué)習(xí)什么 預(yù)覽式外呼系統(tǒng) 長(zhǎng)春極信防封電銷卡批發(fā) 銀川電話機(jī)器人電話 外賣地址有什么地圖標(biāo)注

一、過(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=1size=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=3offset=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的異常——>認(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)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Django實(shí)現(xiàn)drf搜索過(guò)濾和排序過(guò)濾

標(biāo)簽:西寧 宜昌 盤錦 湖北 潮州 上饒 珠海 佳木斯

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《DRF過(guò)濾排序分頁(yè)異常處理的過(guò)程記錄》,本文關(guān)鍵詞  DRF,過(guò)濾,排序,分頁(yè),異常,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《DRF過(guò)濾排序分頁(yè)異常處理的過(guò)程記錄》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于DRF過(guò)濾排序分頁(yè)異常處理的過(guò)程記錄的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    日日日夜夜操| 精品在线免费播放| 精品国产亚洲一区二区三区| 91麻豆高清国产在线播放| 国产成人啪精品视频免费软件| 国产亚洲免费观看| 国产成人精品综合久久久| 国产视频一区在线| 国产91素人搭讪系列天堂| 日韩在线观看视频黄| 四虎影视库| 国产伦久视频免费观看 视频 | 欧美日本韩国| 亚洲 国产精品 日韩| 欧美国产日韩久久久| 一级女性全黄生活片免费| 你懂的福利视频| 国产精品1024永久免费视频| 精品国产亚一区二区三区| 尤物视频网站在线观看| 午夜激情视频在线播放| 欧美激情一区二区三区在线| 成人高清视频免费观看| 一级女性大黄生活片免费| 日本在线不卡视频| 国产一级生活片| 香蕉视频一级| 一级女人毛片人一女人| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚洲女人国产香蕉久久精品| 国产不卡在线观看| 亚飞与亚基在线观看| 国产网站免费视频| 91麻豆精品国产高清在线| 一级女性大黄生活片免费| 欧美日本二区| 亚洲第一视频在线播放| 久久99欧美| 四虎影视久久| 午夜激情视频在线观看| 成人免费观看的视频黄页| 国产一区免费观看| 国产伦久视频免费观看 视频 | 国产美女在线观看| 国产高清在线精品一区二区| 亚欧乱色一区二区三区| 日本在线www| 日韩一级黄色片| 精品国产一区二区三区久久久蜜臀| 国产一区二区精品| 亚洲 欧美 91| 久久精品免视看国产成人2021| 黄视频网站在线免费观看| 久久国产影院| 日韩欧美一二三区| a级毛片免费观看网站| 欧美大片毛片aaa免费看| 可以免费在线看黄的网站| 日韩专区亚洲综合久久| 国产伦久视频免费观看视频| 精品国产一区二区三区久| 午夜家庭影院| 在线观看成人网 | 亚洲第一视频在线播放| 日韩免费在线观看视频| 国产韩国精品一区二区三区| 欧美另类videosbestsex视频| 国产91视频网| 亚洲天堂免费观看| 在线观看成人网 | 亚洲www美色| 在线观看成人网 | 精品国产香蕉在线播出| 免费的黄视频| 日本在线不卡免费视频一区| 欧美激情一区二区三区在线| 国产不卡精品一区二区三区| 日韩av片免费播放| 精品国产亚洲人成在线| 亚飞与亚基在线观看| 久久精品免视看国产明星| 精品视频免费观看| 国产麻豆精品hdvideoss| 国产成人啪精品视频免费软件| 国产一区二区精品| 精品国产一区二区三区精东影业| 天天做人人爱夜夜爽2020| 一级女人毛片人一女人| 欧美1卡一卡二卡三新区| 亚洲第一色在线| 日韩免费在线观看视频| 免费一级片网站| 美女被草网站| 欧美激情一区二区三区中文字幕| 国产一区国产二区国产三区| 沈樵在线观看福利| 九九免费精品视频| 九九热精品免费观看| 国产精品12| 午夜在线影院| 午夜在线亚洲| 国产视频久久久久| 国产一区二区精品久| 超级乱淫伦动漫| 久久福利影视| 一级毛片看真人在线视频| 亚洲 激情| 免费毛片播放| 国产一级生活片| 久久精品欧美一区二区| 亚洲天堂免费观看| 中文字幕Aⅴ资源网| 欧美大片一区| 亚洲天堂在线播放| 国产福利免费视频| 你懂的日韩| 免费一级片网站| 国产一级强片在线观看| 黄视频网站免费| 免费国产在线观看| 亚洲不卡一区二区三区在线 | 中文字幕一区二区三区 精品| 99色视频在线| 精品国产三级a∨在线观看| 日韩专区一区| 成人免费一级毛片在线播放视频| 九九精品久久| 亚欧乱色一区二区三区| 99色精品| 九九热精品免费观看| 色综合久久手机在线| 国产一区精品| 欧美大片毛片aaa免费看| 成人免费高清视频| 青青青草影院| 日韩在线观看免费完整版视频| 久久久久久久久综合影视网| 美国一区二区三区| 黄视频网站免费观看| 青青青草视频在线观看| 国产伦久视频免费观看视频| 色综合久久久久综合体桃花网| 亚洲 欧美 91| 沈樵在线观看福利| 精品视频一区二区三区| 国产原创视频在线| 91麻豆高清国产在线播放| 精品视频一区二区三区免费| 亚洲女人国产香蕉久久精品| 国产a网| 国产91精品系列在线观看| 色综合久久天天综合| 四虎影视库国产精品一区| 国产高清视频免费| 国产综合成人观看在线| 999久久66久6只有精品| 日韩在线观看免费完整版视频| 一级女性全黄久久生活片| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日韩在线观看视频网站| 精品美女| 亚洲第一页乱| 毛片成人永久免费视频| 黄色免费三级| 国产伦精品一区三区视频| 青青久久精品国产免费看| 欧美激情在线精品video| 色综合久久天天综线观看| 午夜在线观看视频免费 成人| 国产视频一区二区在线播放| 九九热精品免费观看| 黄色免费网站在线| 国产综合91天堂亚洲国产| 精品国产一区二区三区国产馆| 欧美另类videosbestsex久久| 999久久66久6只有精品| 日韩专区亚洲综合久久| 欧美日本韩国| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产一区二区精品| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 久久成人亚洲| 一级女性全黄生活片免费| 日韩av东京社区男人的天堂| 九九精品在线| 九九免费精品视频| 日韩中文字幕在线播放| 国产精品免费久久| 欧美大片aaaa一级毛片| 亚洲第一页乱| 黄色短视频网站| 香蕉视频一级| 日本伦理片网站| 精品视频在线观看免费| 国产麻豆精品免费密入口| 久久精品免视看国产成人2021| 香蕉视频三级| 国产视频在线免费观看| 欧美日本免费| 国产a免费观看|