1. 程式人生 > 其它 >drf中3個分頁器類、藉助coreapi生成介面文件

drf中3個分頁器類、藉助coreapi生成介面文件

drf分頁器

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
# 寫一個類,繼承drf 提供的3個內建分頁器類(PageNumberPagination, LimitOffsetPagination, CursorPagination)之一,自己再重寫4個屬性:


1.1 繼承PageNumberPagination, 的自定義分頁器類

重要屬性
每頁展示條數 page_size = xx  
分頁名稱:(http://127.0.0.1:8000/book1/?yy=2page_query_param = yy
設定一個欄位,在路由中為其賦值,可以修改每頁展示條數: page_size_query_param = aa
每頁展示最大條數 max_page_size = bb
class ContentPagination(PageNumberPagination):
page_size = 2
page_query_param = 'page'
page_size_query_param = 'p'
max_page_size = 5

檢視類

class Book1(ModelViewSet, ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerial
# 取消認證
authentication_classes = []
permission_classes = []
throttle_classes = []

pagination_class = ContentPagination

測試

http://127.0.0.1:8000/book1/?p=10&page=2,
這裡雖然使用了p=10來設定每頁展示的條數,但是它超過了我們設定的max_page_size = 5,所以得到的結果是每頁只展示5條

1.2 LimitOffsetPagination 偏移分頁

重要屬性
# 重要的類屬性
default_limit = api_settings.PAGE_SIZE # 顯示多少條
limit_query_param = 'limit' # limit的引數http://127.0.0.1:8000/books/?limit=2&offset=4
offset_query_param = 'offset' # offset偏移的查詢引數http://127.0.0.1:8000/books/?limit=2&offset=4
max_limit = 5 # 最大顯示條數,為5

使用

# 流程,自定義類,繼承方法,重寫屬性,在檢視類中使用。

繼承類

class Book2(ModelViewSet, ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerial
# 取消認證
authentication_classes = []
permission_classes = []
throttle_classes = []

pagination_class = Page2

自定義類

class Page2(LimitOffsetPagination):
default_limit = 2
limit_query_param = 'limit'
offset_query_param = 'offset'
max_limit = 5

1.3 CursorPagination 遊標分頁

# 重要類屬性
cursor_query_param = 'cursor' # 查詢條件
page_size = api_settings.PAGE_SIZE # 每頁顯示多少條
ordering = 'id' # 排序,按id排序
page_size_query_param = 'size' # 通過這個引數決定每頁顯示多少條
max_page_size = 5 # 每頁最大顯示多少條


## 優點:速度最快,資料量越大,越有優勢
## 缺點:只能前一頁和後一頁,不能直接跳到某一頁

# 訪問
http://127.0.0.1/four/students/?cursor=cD0xNQ%3D%3D

注意

上面的ordering,根據的models裡面表中的欄位,還可以在models中這樣設定:
class Book(models.Model):
name = models.CharField(max_length=24)
price = models.CharField(max_length=12)
# 外來鍵,與Publish表相關聯,一對多關係
publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)

class Meta:
ordering = ('publish',)
# 這裡使用publish是因為價格的欄位是CharField,字串效果不明顯,所以用一個數字屬性的欄位,效果就能夠看出來了。

有時候會遇見一個警告

You have specified a default PAGE_SIZE pagination rest_framework setting, without specifying also a DEFAULT_PAGINATION_CLASS.
HINT: The default for DEFAULT_PAGINATION_CLASS is None. In previous versions this was PageNumberPagination. If you wish to define PAGE_SIZE globally whilst defining pagination_class on a per-view basis you may silence this check.
(
您指定了預設的頁面大小分頁rest框架設定,但沒有同時指定預設分頁類。
提示:預設分頁類的預設值是None。在以前的版本中,這是PageNumberPagination。如果您希望全域性定義頁面大小,同時按每個檢視定義分頁類,則可以取消此檢查。 )

方法二:'DEFAULT_PAGINATION_CLASS':['app01.myuntils.Page2', 'app01.myuntils.Page3',],

在專案配置檔案中,配置

自動生成介面文件(3星

# 後端人員寫好介面,編寫介面文件,給前端人員看,前端人員依照介面文件開發

# 公司裡主流
-後端,使用world,md寫,提到git上
-公司有介面平臺,後端開發在介面平臺錄入(yapi,第三方),可以批量匯入
-後端專案自動生成介面文件(不是特別美觀或友好,有時候還需要配合上面兩種)
-django的drf自動生成 coerapi,swagger:java,go,python
# 第一步:安裝coreapi
# 第二步:路由中配置
from rest_framework.documentation import include_docs_urls
urlpatterns = [
path('docs/', include_docs_urls(title='路飛專案介面文件')),]


# 第三步:配置檔案中配置
REST_FRAMEWORK = {
## 介面文件配置
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}

#第四步:寫介面,加註釋

# 第五步:訪問
http://127.0.0.1:8000/docs/

# 還可以在自定義序列化元件中使用,比如對某些欄位進行說明等