[Django REST framework – 自動生成介面文檔、分頁]
- 2021 年 7 月 7 日
- 筆記
- django框架
[Django REST framework – 自動生成介面文檔、分頁]
自動生成介面文檔
# 後端人員寫好介面,編寫介面文檔,給前端人員看,前端人員依照介面文檔開發
# 公司里主流
-後端,使用world,md寫,提到git上
-公司有介面平台,後端開發在介面平台錄入(yapi,第三方),可以批量導入
-後端項目自動生成介面文檔(不是特別美觀或友好,有時候還需要配合上面兩種)
-django的drf自動生成 coerapi,swagger:java,go,python
REST framework可以自動幫助我們生成介面文檔。
介面文檔以網頁的方式呈現。
自動介面文檔能生成的是繼承自APIView
及其子類的視圖。
介面文檔 coreapi,swagger
安裝依賴:REST framewrok生成介面文檔需要coreapi庫的支援。
pip3 install coreapi
使用步驟:
1 在urls.py 路由中
from rest_framework.documentation import include_docs_urls
urlpatterns = [
path('doc/', include_docs_urls(title='圖書管理項目介面文檔')),
]
2 在settings.py 配置文件中
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}
3 在view.py 視圖類中對應的方法上加註釋即可
4 如果是ModelViewSet
from app01 import models
from app01 import serializer
from rest_framework.viewsets import ModelViewSet
from rest_framework.filters import OrderingFilter
class BookView(ModelViewSet):
"""
list:
返回圖書列表數據,通過Ordering欄位排序
retrieve:
返回圖書詳情數據
latest:
返回最新的圖書數據
read:
查詢單個圖書介面
"""
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# 排序
filter_backends = [OrderingFilter,]
ordering_fields = ['price','name']
5 欄位描述,寫在models.py的help_text上
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=34,help_text='名字欄位,字元串')
price = models.IntegerField(help_text='價格欄位,整型')
6 瀏覽的地址(瀏覽器中)
//127.0.0.1:8000/doc/
# 如果繼承的是其它視圖類,直接在對應的def函數下面寫注釋即可,例:
class BookView(APIView):
def get(self, request):
"""
所有圖書資訊
:param request:
:return:
"""
res = models.Book.objects.all()
ser = serializer.BookModelSerializer(instance=res, many=True)
return Response(ser.data)

REST framework提供了分頁的支援。可選分頁器有三種
三種分頁方式
1 三種分頁方式
-基本分頁:PageNumberPagination
page_size = 2 # 每頁顯示兩條
page_query_param = 'page' #查詢第幾頁的參數 ?page=3
max_page_size = 4 #每頁最大顯示多少條
page_size_query_param = 'size' #每頁顯示的條數查詢條件(默認是page_size顯示的條數) # ?page=3&size=3
-偏移分頁:LimitOffsetPagination
default_limit=2 #默認顯示幾條
limit_query_param='limit' # ?limit=3 表示取3條
offset_query_param = 'offset' #偏移 ?offset=5&limit=3 #從第5個位置開始,取3條數據
max_limit = 5 #最多顯示5條
-游標分頁:CursorPagination
cursor_query_param = 'cursor' # 查詢的key值
page_size = 2 # # 每頁顯示兩條
ordering = 'id' # 按id欄位排序
2 如何使用
- APP下創建一個自定義py文件,eg:page.py
- 在文件中寫一個自定義分頁類,繼承三個之一,並重寫類屬性
- 在視圖類中配置
class BookView(ViewSetMixin,ListAPIView,CreateAPIView):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# 配置使用的分頁類
pagination_class = CustomNumberPagination
- 局部使用
pagination_class = CustomNumberPagination
- 全局使用,在配置文件中(以後所有視圖的查詢所有方法都用這個分頁)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'app01.page.CustomNumberPagination'
}
也是用的最多的一種
創建一個py文件 # 任意名字 例如:page.py
1、在page.py 中自定義一個類,繼承PageNumberPagination,並重寫類屬性
from rest_framework.pagination import PageNumberPagination # 導入模組
class CustomNumberPagination(PageNumberPagination): # 定義類名繼承父類 重寫屬性
page_size = 2 # 每頁顯示兩條
page_query_param = 'page' #查詢第幾頁的參數 ?page=3
max_page_size = 4 # 每頁最大顯示多少條
page_size_query_param = 'size' #每頁顯示的條數查詢條件(默認是page_size顯示的條數) # ?page=2&size=3
2、在views.py 視圖類中配置
from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.viewsets import ViewSetMixin
from app01.page import CustomNumberPagination # 導入自定義分頁類
class BookView(ViewSetMixin,ListAPIView,CreateAPIView):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# 配置使用的分頁類
pagination_class = CustomNumberPagination # 自己定義的類名
4、請求方式:(postman中測試)
//127.0.0.1:8000/books/?page=3 # 查第3頁
//127.0.0.1:8000/books/?page=2&size=3 # 第2頁顯示3條
3、局部使用(視圖類中)
pagination_class = CustomNumberPagination
4、全局使用,在settings.py 配置文件中(以後所有視圖的查詢所有方法都用這個分頁)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'app01.page.CustomNumberPagination'
}

用的比較少的一種
1、在page.py 中自定義一個分頁類,繼承LimitOffsetPagination,並重寫類屬性
from rest_framework.pagination import LimitOffsetPagination # 導入模組
class CustomLimitOffsetPagtion(LimitOffsetPagination):
default_limit=2 # 默認顯示幾條
limit_query_param='limit' # ?limit=3 表示取3條
offset_query_param = 'offset' #偏移 ?offset=5&limit=3 從第5個位置開始,取3條數據
max_limit = 5 #最多顯示5條
# 手動寫顯示10條 也是顯示5條 因為這已經寫死了
2、在views.py 視圖類中配置
from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.viewsets import ViewSetMixin
from app01.page import CustomLimitOffsetPagtion # 導入自定義偏移分頁類
class BookView(ViewSetMixin,ListAPIView,CreateAPIView):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# 配置使用的分頁類
pagination_class = CustomLimitOffsetPagtion
4、請求方式:(postman中測試)
//127.0.0.1:8000/books/ # 默認從0開始取2條
//127.0.0.1:8000/books/?limit=3&offset=2 # 取3條,從第2條開始
3、局部使用(視圖類中)
pagination_class = CustomLimitOffsetPagtion
4、全局使用,在settings.py 配置文件中(以後所有視圖的查詢所有方法都用這個分頁)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'app01.page.CustomLimitOffsetPagtion'
}

基本不用,但針對千萬級別的數據,為了降低資料庫的壓力,建議使用這種
1、在page.py 中自定義一個分頁類,繼承CursorPagination,並重寫類屬性
## 優點:速度最快,數據量越大,越有優勢
## 缺點:只能前一頁和後一頁,不能直接跳到某一頁
from rest_framework.pagination import CursorPagination
class CustomCursorPagination(CursorPagination): # 查詢速度最快
cursor_query_param = 'cursor' # 查詢的key值
page_size = 2 # 每頁顯示兩條
ordering = 'id' # 按id欄位排序 必須寫不然報錯
# 下面兩個基本不用可配可不配
page_size_query_param = 'size' # 通過這個參數決定每頁顯示多少條
max_page_size = 5 # 每頁最大顯示多少條
2、在views.py 視圖類中配置
from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.viewsets import ViewSetMixin
from app01.page import CustomCursorPagination # 導入自定義游標分頁類
class BookView(ViewSetMixin,ListAPIView,CreateAPIView):
queryset = models.Book.objects.all()
serializer_class = serializer.BookModelSerializer
# 配置使用的分頁類
pagination_class = CustomCursorPagination
4、請求方式:(postman中測試)
//127.0.0.1:8000/books/?cursor=cD0y # 按照cursor給的key值查找下一頁
//127.0.0.1:8000/books/?cursor=cj0xJnA9Mw%3D%3D # 按照cursor給的key值查找上一頁
3、局部使用(視圖類中)
pagination_class = CustomCursorPagination
4、全局使用,在settings.py 配置文件中(以後所有視圖的查詢所有方法都用這個分頁)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'app01.page.CustomCursorPagination'
}
繼承APIView實現三種分頁方式
class BookViewALL(APIView): # 繼承APIView 需要自己寫路由
def get(self,request,*args,**kwargs):
book_list=Books.objects.all()
#實例化得到一個對象
pagination=CommonPageNumberPagination() # 只需要換此處的類就可以實現三種分頁的效果
# 修改對象屬性,我們不需要改
# pagination.page_query_param='page'
#調用對象方法,傳入要分頁的數據,book_list,返回分頁號的數據
book_list2=pagination.paginate_queryset(book_list,request,self)
ser=BookSerializer(instance=book_list2,many=True) # 序列化器
# 自己寫返回格式
res={'pre':pagination.get_previous_link(),'next':pagination.get_next_link(),'count':pagination.page.paginator.count,'data':ser.data}
return Response(res)
# 另一種返回方式 調用父類中的方法返回
return pagination.get_paginated_response(ser.data)
