過濾組件、排序組件、全局異常處理、自己封裝的response對象

来源:https://www.cnblogs.com/suncolor/archive/2022/10/20/16810574.html
-Advertisement-
Play Games

過濾組件 查詢所有才涉及到過濾,其他介面都不需要 restful規範中有一條,請求地址中帶過濾條件:分頁、排序、過濾統稱為過濾 內置過濾類 使用內置過濾類的步驟 必須是繼承GenericAPIView+ListModelMixin的之類視圖上 1.配置過濾類 filter_backends=[Sea ...


過濾組件

查詢所有才涉及到過濾,其他介面都不需要
restful規範中有一條,請求地址中帶過濾條件:分頁、排序、過濾統稱為過濾

內置過濾類

使用內置過濾類的步驟

必須是繼承GenericAPIView+ListModelMixin的之類視圖上

1.配置過濾類
    filter_backends=[SearchFilter,]
2.配置過濾類的欄位
    search_fields = ['name', ]
3.支持前端的訪問形式
    http://127.0.0.1:8000/books/?search=三 # 只要name中或publish中有三都能搜出來

內置過濾類只能通過search寫條件,如果配置了多個過濾欄位,是或者的條件

image

採用第三方過濾組件

#1 安裝:pip3 install django-filter
#2 註冊,在app中註冊django-filter
#3 全局配,或者局部配
 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
#4 視圖類
class BookView(ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_fields = ('name',)  #配置可以按照哪個欄位來過濾

排序組件

排序功能只針對於所有介面,繼承了GenericAPIView的視圖類,只要加入,倆個類屬性就可以了

from rest_framework.filters import OrderingFilter


# 查詢所有,按照價格排序,必須繼承GenericAPIView及其子類
class BookView(ViewSetMixin, GenericAPIView, ListModelMixin):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    filter_backends = [OrderingFilter, ]
    ordering_fields = ['price',]

訪問地址:
http://127.0.0.1:8000/books/?ordering=-price  # 按照price降序
http://127.0.0.1:8000/books/?ordering=price  # 按照price升序
http://127.0.0.1:8000/books/?ordering=price,id # 先按價格升序排,價格一樣再按id升序排

註意:
ordering後面跟的必須要在ordering_fields = ['price','id']先註冊好

image

全局異常處理

用於:統一介面返回

# 自定義異常方法,替換掉全局
# 寫一個方法
# 自定義異常處理的方法
from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status
def my_exception_handler(exc, context):
    response=exception_handler(exc, context)
    # 兩種情況,一個是None,drf沒有處理
    #response對象,django處理了,但是處理的不符合咱們的要求
    # print(type(exc))

    if not response:
        if isinstance(exc, ZeroDivisionError):
            return Response(data={'status': 777, 'msg': "除以0的錯誤" + str(exc)}, status=status.HTTP_400_BAD_REQUEST)
        return Response(data={'status':999,'msg':str(exc)},status=status.HTTP_400_BAD_REQUEST)
    else:
        # return response
        return Response(data={'status':888,'msg':response.data.get('detail')},status=status.HTTP_400_BAD_REQUEST)
    
# 全局配置setting.py
'EXCEPTION_HANDLER': 'app01.app_auth.my_exception_handler',

自己封裝的response對象

# 以後都用自己封裝的
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":'lqz'},token='dsafsdfa',aa='dsafdsafasfdee')
return APIResponse(data={"name":'lqz'})
return APIResponse(code='101',msg='錯誤',data={"name":'lqz'},token='dsafsdfa',aa='dsafdsafasfdee',header={})

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 每年的蘋果新產品發佈,其官網都會配套更新相應的單頁滾動產品介紹頁。其中的動畫特效都非常有意思,今年 iPhone 14 Pro 的介紹頁不例外。 最近,剛好有朋友問到,其對官網的一段文字特效特別感興趣,看適用簡單卻不知從何下手,我們來看看: 整個動畫大致是,隨著頁面的向下滾動,整個文字從無到出現,再 ...
  • call,apply,bind作為改變this指向的法寶,那麼它們是怎麼做到的呢,接下來嘗試邊分析、邊構造: 我們先來構造一個mycall骨架,把功能添加到原型鏈 讓函數依附於某個對象,並且以對象方法的方式執行,以此來改變this指向,需要註意: 為了避免不必要的覆蓋,我們使用Symbol作為key ...
  • 近期,數據中心系統負荷大,mysql伺服器的CPU動輒達到90%以上。代碼和數據表存在很大優化空間。 這裡分享一個定時任務批量處理數據的優化過程。 先介紹定時任務 先介紹下麵2張數據表 欄位 數據量 platform_order 平臺交易訂單表 有超過50多個欄位。 包括 主鍵自增id、客戶id、客 ...
  • 前言 嗨嘍~大家好呀,這裡是魔王吶 ! 國企文員和游戲陪玩兩個職業間,你會選擇哪個? 00後李明的答案是後者。 今年3月,某二本院校應屆畢業生李明,兜兜轉轉,沒有找到特別合心的工作 卻憑著還不錯的游戲技術,成為了全職的游戲陪玩。 “按單收費,大概一單大概兩三百元,按時長收費,一小時50到100元”, ...
  • 滿漢樓02 4.功能實現04 4.6顯示所有菜品 4.6.1思路分析 創建一個菜單表menu,在Domain層創建與菜單表對應的Javabean-Menu類,在DAO層創建MenuDAO,完成對menu表的增刪改查,在Service層創建一個和menu表相關的service類,service類提供給 ...
  • 在筆者之前的文章`《驅動開發:內核特征碼搜索函數封裝》`中我們封裝實現了特征碼定位功能,本章將繼續使用該功能,本次我們需要枚舉內核`LoadImage`映像回調,在Win64環境下我們可以設置一個`LoadImage`映像載入通告回調,當有新驅動或者DLL被載入時,回調函數就會被調用從而執行我們自己... ...
  • 集合 Scala的集合有三大類: 序列Seq、集Set、映射Map 所有的集合都擴展自Iterable特質。對於幾乎所有的集合類 Scala都同時提供了可變和不可變的版本 可變集合 可以在適當的地方被更新或擴展。這意味著你可以修改,添加,移除一個集合的元素。 不可變集合 永遠不會改變。不過,你仍然可 ...
  • LRU:最近最少使用緩存 LRU是Least Recently Used的縮寫,即最近最少使用,是一種常用的頁面置換演算法,選擇最近最久未使用的頁面予以淘汰。該演算法賦予每個頁面一個訪問欄位,用來記錄一個頁面自上次被訪問以來所經歷的時間 t,當須淘汰一個頁面時,選擇現有頁面中其 t 值最大的,即最近最少 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...