7.DRF 過濾、排序、分頁

過濾Filtering

對于列表數據可能需要根據字段進行過濾,我們可以通過添加django-fitlter擴展來增強支持。

pip install django-filter

在配置文件中增加過濾器類的全局設置:

"""drf配置信息必須全部寫在REST_FRAMEWORK配置項中"""
REST_FRAMEWORK = {# ....代碼省略。。。# 過濾查詢,全局配置'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
}

在視圖類中添加類屬性filter_fields,指定可以過濾的字段

class Hom4APIView(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentModelSerializerfilter_fields = ["sex","classmate"]# list方法中進行調用->調用了GenericAPIView中聲明的filter_queryset方法---> 配置中的過濾器類的filter_queryset---> filter_fields# 單個字段過濾
# http://127.0.0.1:8000/opt/s4/?classmate=502&sex=2
# http://127.0.0.1:8000/opt/s4/?sex=2
# 多個字段過濾
# http://127.0.0.1:8000/opt/s4/?classmate=502&sex=2

路由代碼:

from django.urls import path,include
from . import viewsfrom rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register("s2", views.Hom2APIView, "s2")
router.register("s4", views.Hom4APIView, "s4")urlpatterns = [path("s1/", views.HomeAPIView.as_view()),path("", include(router.urls)),  # 等價于  urlpatterns += router.urlspath("s3/", views.Hom3APIView.as_view()),path("s3/", views.Hom3APIView.as_view()),
]

局部設置,直接在視圖中,指定當前視圖類中調用的過濾器類

# 先注釋掉settings中的全局過濾配置
from rest_framework.viewsets import ModelViewSet
from students.models import Student
from students.serializers import StudentModelSerializer
# Create your views here.
from django_filters.rest_framework import DjangoFilterBackend
class Hom4APIView(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentModelSerializerfilter_backends = [DjangoFilterBackend, ]filter_fields = ["sex","classmate"]# list方法中進行調用->調用了GenericAPIView中聲明的filter_queryset方法---> 配置中的過濾器類的filter_queryset---> filter_fields

排序Ordering

對于列表數據,REST framework提供了OrderingFilter過濾器來幫助我們快速指明數據按照指定字段進行排序。

使用方法:

在類視圖中設置filter_backends,使用rest_framework.filters.OrderingFilter過濾器,REST framework會在請求的查詢字符串參數中檢查是否包含了ordering參數,如果包含了ordering參數,則按照ordering參數指明的排序字段對數據集進行排序。

前端可以傳遞的ordering參數的可選字段值需要在ordering_fields中指明。

配置文件,settings.py,代碼:

"""drf配置信息必須全部寫在REST_FRAMEWORK配置項中"""
REST_FRAMEWORK = {# 。。。代碼省略# 過濾查詢,全局配置# 過濾和排序使用了一個公用的配置項,所以2個組件要么一起全局配置,要么就一起局部配置'DEFAULT_FILTER_BACKENDS': [#     'django_filters.rest_framework.DjangoFilterBackend',  # 過濾'rest_framework.filters.OrderingFilter',  # 排序],
}

視圖代碼:

from rest_framework.viewsets import ModelViewSet
from students.models import Student
from students.serializers import StudentModelSerializer
# Create your views here.
from django_filters.rest_framework import DjangoFilterBackend
class Hom4APIView(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentModelSerializer# 局部過濾# filter_backends = [DjangoFilterBackend, OrderingFilter]# 過濾字段# filter_fields = ["sex","classmate"]# 數據排序ordering_fields = ['id', 'age']# 127.0.0.1:8000/books/?ordering=-age
# -id 表示針對id字段進行倒序排序
# id  表示針對id字段進行升序排序

上面提到,因為過濾和排序公用了一個配置項,所以排序和過濾要一起使用,則必須整個項目,要么一起全局過濾排序,要么一起局部過濾排序。

from rest_framework.viewsets import ModelViewSet
from students.models import Student
from students.serializers import StudentModelSerializer
# Create your views here.
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
class Hom4APIView(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentModelSerializer# 局部過濾filter_backends = [DjangoFilterBackend, OrderingFilter]# 過濾字段filter_fields = ["sex","classmate"]# list方法中進行調用->調用了GenericAPIView中聲明的filter_queryset方法---> 配置中的過濾器類的filter_queryset---> filter_fields# 數據排序ordering_fields = ['id', 'age']

分頁Pagination

因為django默認提供的分頁器主要使用于前后端不分離的業務場景,所以REST framework也提供了分頁的支持。

我們可以在配置文件中設置全局的分頁方式,如:

REST_FRAMEWORK = {# 分頁,全局配置# 頁碼分頁器,  ?page=頁碼&page_size=單頁數據量# 'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',# 偏移量分頁器, ?limit=單頁數據量&offset=數據開始下標'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.LimitOffsetPagination','PAGE_SIZE': 10  # 每頁數目,如果不設置,則沒有進行分配
}
# 如果在settings.py配置文件中, 設置了全局分頁,那么在drf中凡是調用了ListModelMixin的list(),都會自動分頁。如果項目中出現大量需要分頁的數據,只有少數部分的不需要分頁,則可以在少部分的視圖類中關閉分頁功能。
# 另外,視圖類在使用過分頁以后,務必在編寫queryset屬性時,模型.objects后面調用結果。例如:
# Student.objects.all()
class Hom5APIView(ListAPIView):pagination_class = None

也可通過自定義Pagination類,來為視圖添加不同分頁行為。在視圖中通過pagination_clas屬性來指明。

可選分頁器

1) PageNumberPagination

前端訪問網址形式:

GET  http://127.0.0.1:8000/students/?page=4

可以在子類中定義的屬性:

  • page_size 每頁數目
  • page_query_param 前端發送的頁數關鍵字名,默認為"page"
  • page_size_query_param 前端發送的每頁數目關鍵字名,默認為None
  • max_page_size 前端最多能設置的每頁數量

分頁器類,paginations,代碼:

from  rest_framework.pagination import PageNumberPagination,LimitOffsetPagination
# PageNumberPagination,以頁碼作為分頁條件
# page=1&page_size=10      第1頁
# page=2&page_size=10      第2頁
# ...
# LimitOffsetPagination,以數據庫查詢的limit和offset數值作為分頁條件
# limit=10&offset=0   第1頁
# limit=10&offset=10  第2頁
# ...# 自定義分頁器,PageNumberPagination
class StudentPageNumberPagination(PageNumberPagination):page_query_param = "page" # 查詢字符串中代表頁碼的變量名page_size_query_param = "size" # 查詢字符串中代表每一頁數據的變量名page_size = 2 # 每一頁的數據量max_page_size = 4 # 允許客戶端通過查詢字符串調整的最大單頁數據量

視圖,views ,代碼:

from rest_framework.pagination import LimitOffsetPagination, PageNumberPagination# 分頁類往往會單獨的保存到一個獨立的模塊,例如:當前子應用目錄下創建一個pagination.py保存,使用時導包
class Hom5PageNumberPagination(PageNumberPagination):page_size = 10                  # 默認分頁的每一頁數據量max_page_size = 20              # 設置允許客戶端通過地址欄參數調整的最大單頁數據量page_query_param = "pn"         # 地址欄上代表頁碼的變量名,默認是 pagepage_size_query_param = "size"  # 地址欄上代表單頁數據量的變量名,默認是page_sizeclass Hom5APIView(ModelViewSet):# queryset = Student.objects  # 這句話在沒有進行分頁時不會報錯,調用了分頁則會報錯!queryset = Student.objects.all()serializer_class = StudentModelSerializer# 局部分頁# pagination_class = None  # 關閉分頁功能# 局部分頁往往采用自定義分頁類,進行分頁數據量的配置pagination_class = Hom5PageNumberPaginationdef list(self, request, *args, **kwargs):# 獲取django的配置項from django.conf import settings# 獲取rest_framework的配置項# from rest_framework.settings import api_settings# print(api_settings.DEFAULT_PAGINATION_CLASS)return super().list(request, *args, **kwargs)

2)LimitOffsetPagination

前端訪問網址形式:

GET http://127.0.0.1/four/students/?limit=100&offset=100

可以在子類中定義的屬性:

  • default_limit 默認限制,默認值與PAGE_SIZE設置一直
  • limit_query_param limit參數名,默認’limit’
  • offset_query_param offset參數名,默認’offset’
  • max_limit 最大limit限制,默認None

分頁類,代碼:

from  rest_framework.pagination import PageNumberPagination,LimitOffsetPagination
# PageNumberPagination,以頁碼作為分頁條件
# page=1&size=10      第1頁
# page=2&size=10      第2頁
# LimitOffsetPagination,以數據庫查詢的limit和offset數值作為分頁條件
# limit=10&offset=0   第1頁
# limit=10&offset=10  第2頁# LimitOffsetPagination
class StudentLimitOffsetPagination(LimitOffsetPagination):limit_query_param = "limit" # 查詢字符串中代表每一頁數據的變量名offset_query_param = "offset" # 查詢字符串中代表頁碼的變量名default_limit = 2 # 每一頁的數據量max_limit = 4 # 允許客戶端通過查詢字符串調整的最大單頁數據量

視圖,views,代碼:

from .paginations import StudentPageNumberPagination,StudentLimitOffsetPagination
class Student3ModelViewSet(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentModelSerializer# 取消當前視圖類的分頁效果# pagination_class = None# 局部分頁pagination_class = StudentLimitOffsetPagination

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90981.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二、CUDA、Pytorch與依賴的工具包

CUDA Compute Unified Device Architecture(統一計算架構)。專門用于 GPU 通用計算 的平臺 編程接口。CUDA可以使你的程序(比如矩陣、神經網絡)由 GPU 執行,這比CPU能快幾十甚至上百倍。 PyTorch 是一個深度學習框架…

SpringCloude快速入門

近期簡單了解一下SpringCloude微服務,本文主要就是我學習中所記錄的筆記,然后具體原理可能等以后再來深究,本文可能有些地方用詞不專業還望包容一下,感興趣可以參考官方文檔來深入學習一下微服務,然后我的下一步學習就是docker和linux了。 nacos: Nacos 快速開始 | Nacos 官網…

GPT Agent與Comet AI Aent瀏覽器對比橫評

1. 架構設計差異GPT Agent的雙瀏覽器架構:文本瀏覽器:專門用于高效處理大量文本內容,適合深度信息檢索和文獻追蹤,相當于Deep Research的延續可視化瀏覽器:具備界面識別與交互能力,可以點擊網頁按鈕、識別圖…

應用信息更新至1.18.0

增加DO權限 增加權限管理(需DO支持) 增加應用凍結隱藏(需DO支持) 增加權限委托(需DO支持) 增加特殊組件 ...

常用git命令集錦

git init 初始化 將當前目錄初始化為 git 本地倉庫,此時會在本地創建一個 .git 的文件夾 git init -q 靜默執行,就是在后臺執行 git init --bare –bare 參數,一般用來初始化一個空的目錄,作為遠程存儲倉庫 git init --template dir –templa…

skywalking安裝

一、簡介 SkyWalking是一款用于分布式系統跟蹤和性能監控的開源工具。它可以幫助開發人員了解分布式系統中不同組件之間的調用關系和性能指標,從而進行故障排查和性能優化。 它支持多種語言和框架,包括Java、.NET、Node.js等。它通過在應用程序中插入代…

利用DataStream和TrafficPeak實現大數據可觀察性

可觀察性工作流對于深入了解應用程序的健康狀況、客戶流量和整體性能至關重要。然而,要實現真正的可觀察性還面臨一些挑戰,包括海量的流量數據、數據保留、實施時間以及各項成本等。TrafficPeak是一款為Akamai云平臺打造,簡單易用、可快速部署…

jQuery 最新語法大全詳解(2025版)

引言 jQuery 作為輕量級 JavaScript 庫,核心價值在于 簡化 DOM 操作、跨瀏覽器兼容性和高效開發。盡管現代框架崛起,jQuery 仍在遺留系統維護、快速原型開發中廣泛應用。本文涵蓋 jQuery 3.6 核心語法,重點解析高效用法與最佳實踐。 一、jQu…

Android 15 修改截圖默認音量大小

概述 在 Android 15 中,截圖音效的默認音量可能過大,影響用戶體驗。本文將介紹如何通過修改系統源碼來調整截圖音效的默認音量大小。 修改位置 需要修改的文件路徑: frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSoundProvider.kt…

Python爬蟲實戰:快速采集教育政策數據(附官網工具庫API)

解鎖教育政策研究的數據金礦,用技術提升學術效率 在教育政策研究領域,獲取最新、最全面的政策文本是學術工作的基礎。傳統手動收集方式效率低下且容易遺漏關鍵政策,而Python爬蟲技術為教育研究者提供了高效的數據采集解決方案。本文將系統介…

驗證回文串-leetcode

如果在將所有大寫字符轉換為小寫字符、并移除所有非字母數字字符之后,短語正著讀和反著讀都一樣。則可以認為該短語是一個 回文串 。 字母和數字都屬于字母數字字符。 給你一個字符串 s,如果它是 回文串 ,返回 true ;否則&#xf…

嵌入式學習日志(十)

10 學習指針1 指針核心定義與本質1.1 指針與指針變量1、指針即地址,指針變量是存放地址的變量,其大小與操作系統位數相關:64 位系統中占 8 字節,32 位系統中占 4 字節。2、指針的核心功能是通過地址間接訪問目標變量&#xff0…

Anaconda創建環境報錯:CondaHTTPEFTOT: HTTP 403 FORBIDDEN for url

一、快速解決方案這類報錯的原因通常是由于 conda 無法訪問鏡像源或權限被服務器拒絕,以下是常見原因和對應的解決方案:檢查鏡像源拼寫是否正確conda config --show channels清華源鏡像示例如果不正確,先清除舊配置del %USERPROFILE%\.condar…

亞馬遜地址關聯暴雷:新算法下的賬號安全保衛戰

2025年Q3,上千個店鋪因共享稅代地址、海外倉信息重疊等問題被批量凍結,為行業敲響了“精細化合規”的警鐘。事件復盤:地址成為關聯風控的“致命開關”稅代機構違規引發“多米諾效應”事件的導火索指向稅代機構“saqibil”,其為降低…

在本地環境中運行 ‘dom-distiller‘ GitHub 庫的完整指南

在本地環境中運行 ‘dom-distiller’ GitHub 庫的完整指南 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家,覺得好請收藏。點擊跳轉到網站。 1. 項目概述 ‘dom-distiller’ 是一個用于將網頁…

11. isaacsim4.2教程-Transform 樹與Odometry

1. 前言學習目標在本示例中,你將學習如何:使用 TF 發布器將相機作為 TF 樹的一部分發布在 TF 上發布機械臂/可動結構(articulation)的樹狀結構發布里程計(Odometry)消息開始之前前置條件已完成 …

安寶特新聞丨安寶特與Logivations正式建立合作伙伴關系,共筑物流新未來

近日,安寶特與物流創新企業Logivations簽署合作協議,雙方將深度融合技術專長,共同為客戶提供高效、精準的智能物流解決方案,助力企業實現從人工巡檢到智能管控的跨越式升級。 關于Logivations Logivations是一家深耕物流與供應鏈…

第三階段—8天Python從入門到精通【itheima】-139節(pysqark實戰-前言介紹)

目錄 139節——pysqark實戰-前言介紹 1.學習目標 2.spark是什么 3.如下是詳細介紹 PySpark 的兩種使用方式,并提供具體的代碼示例【大數據應用開發比賽的代碼熟悉如潮水一般沖刷我的記憶】: 一、本地模式(作為 Python 第三方庫使用&#…

redis數據庫的四種取得 shell方法

Redis作為高性能內存數據庫,若配置不當(特別是未授權訪問),將面臨極高安全風險。攻擊者可利用漏洞實現遠程代碼執行(GetShell),嚴重威脅數據安全與服務器控制權。本文深入剖析此類漏洞的核心原理…

墨者:SQL過濾字符后手工繞過漏洞測試(萬能口令)

1. 墨者學院:SQL過濾字符后手工繞過漏洞測試(萬能口令)🚀 2. 漏洞背景分析🔍 近期發現某登錄系統存在SQL注入漏洞,攻擊者可通過構造特殊用戶名admin,a,a)#繞過身份驗證。本文將深入解析其工作原理,并演示完整滲透測試流…