REST framework 分頁元件

2021-10-03 06:19:01 字數 4116 閱讀 4128

rest framework提供了分頁的支援。

我們可以在配置檔案settings.py中設定全域性的分頁方式,如:

rest_framework = 

如果在檢視內關閉分頁功能,只需在檢視內設定屬性:

pagination_class = none

1.建立pahenations.py檔案,在其中自定義分頁類(基礎分頁類/偏移分頁類/游標分頁類)

2.檢視類中配置自定義的分頁類:pagination_class= 自定義分頁類

匯入pagenumberpagination類

from rest_framework.pagination import pagenumberpagination

​繼承pagenumberpagination類

class mypagenumberpagination(pagenumberpagination):

# ?page=頁碼

page_query_param = 'page'

# ?page=頁面 下預設一頁顯示的條數

page_size = 3

# ?page=頁面&page_size=條數 使用者自定義一頁顯示的條數

page_size_query_param = 'page_size'

# 使用者自定義一頁顯示的條數最大限制:數值超過5也只顯示5條

max_page_size = 5

屬性:

使用:

from rest_framework.generics import listapiview

​class carlistapiview(listapiview):

# 如果queryset沒有過濾條件,就必須 .all(),不然分頁會出問題

queryset = models.car.objects.all()

serializer_class = serializers.carmodelserializer

# 分頁元件 - 給檢視類配置分頁類即可 - 分頁類需要自定義,繼承drf提供的分頁類即可

pagination_class = pagenations.mypagenumberpagination

eg: /cars/?page=2?page_size=10

每頁顯示10條,共展示2頁

匯入limitoffsetpagination類

from rest_framework.pagination import limitoffsetpagination

繼承limitoffsetpagination類

class mylimitoffsetpagination(limitoffsetpagination):

# ?offset=從頭偏移的條數&limit=要顯示的條數

limit_query_param = 'limit'

offset_query_param = 'offset'

# ?不傳offset和limit預設顯示前3條,只設定offset就是從偏移位往後再顯示3條

default_limit = 3

# ?limit可以自定義一頁顯示的最大條數

max_limit = 5

​ # 只使用limit結合ordering可以實現排行前幾或後幾

# eg: ?ordering=-price&limit=2 => **前2

屬性:

使用:

from rest_framework.generics import listapiview

​class carlistapiview(listapiview):

# 如果queryset沒有過濾條件,就必須 .all(),不然分頁會出問題

queryset = models.car.objects.all()

serializer_class = serializers.carmodelserializer

# 分頁元件 - 給檢視類配置分頁類即可 - 分頁類需要自定義,繼承drf提供的分頁類即可

pagination_class = pagenations.mylimitoffsetpagination

注:必須基於排序規則下進行分頁

1)如果介面配置了orderingfilter過濾器,那麼url中必須傳ordering

2)如果介面沒有配置orderingfilter過濾器,一定要在分頁類中宣告ordering按某個字段進行預設排序

from rest_framework.pagination import cursorpagination

class mycursorpagination(cursorpagination):

cursor_query_param = 'cursor'

page_size = 3

page_size_query_param = 'page_size'

max_page_size = 5

ordering = '-pk'

使用:

from rest_framework.generics import listapiview

​class carlistapiview(listapiview):

# 如果queryset沒有過濾條件,就必須 .all(),不然分頁會出問題

queryset = models.car.objects.all()

serializer_class = serializers.carmodelserializer

# 分頁元件 - 給檢視類配置分頁類即可 - 分頁類需要自定義,繼承drf提供的分頁類即可

pagination_class = pagenations.mycursorpagination

def page_func(request, dirent_list):

new_dirent_list = sorted(dirent_list, key=lambda x:x.get("time"),reverse=true)

try:

current_page = int(request.get.get('page', '1'))

per_page = int(request.get.get('per_page', '10'))

except valueerror:

current_page = 1

per_page = 10

# 總頁數

page_count = len(new_dirent_list) // per_page

if page_count == 0:

page_count = 1

start = (current_page - 1) * per_page # 0

limit = per_page + start # 10

res_list = new_dirent_list[start:limit]

if len(new_dirent_list[limit:]) >= per_page:

has_next_page = true

else:

res_list = new_dirent_list[start:]

has_next_page = false

page_info =

return page_info, res_list

class searchdirview(apiview):

authentication_classes = (tokenauthentication, sessionauthentication)

permission_classes = (isauthenticated, )

throttle_classes = (userratethrottle, )

def get(self,request):

dirent_list = [{}, {}, {},]

page_info, res_list = page_func(request, dirent_list)

return response(

)

rest framework 中的分頁

注意這種寫法不支援api view和api view 配置setting default pagination class 2.建立乙個資料夾mypagenumberpagination class mypagenumberpagination pagenumberpagination page s...

學習週報 rest framework

本週學習情況 1.rest framework的學習 2.前後端分離5 2到5 6 下週學習計畫 停止課程內容學習 2.花10學習rest framework基礎的學習 本週完成情況 一 fbv,cbv 繼承 避免重複 1 優先順序從左往右 2 super 1.先在studentsview裡面查詢,...

rest framework登入認證

class user models.model user models.charfield max length 32 pwd models.charfield max length 32 class usertoken models.model token models.charfield max...