一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Django rest framework實現分頁的示例

Django rest framework實現分頁的示例

2021-02-24 00:11zhang_derek Python

這篇文章主要介紹了Django rest framework實現分頁的示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

第一種分頁pagenumberpagination

基本使用

(1)urls.py

?
1
2
3
urlpatterns = [
  re_path('(?p<version>[v1|v2]+)/page1/', pager1view.as_view(),)  #分頁1
]

(2)api/utils/serializers/pager.py

?
1
2
3
4
5
6
7
8
# api/utils/serializsers/pager.py
from rest_framework import serializers
from api import models
 
class pagerserialiser(serializers.modelserializer):
  class meta:
    model = models.role
    fields = "__all__"

(3)views.py

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from api.utils.serializsers.pager import pagerserialiser
from rest_framework.response import response
from rest_framework.pagination import pagenumberpagination
 
class pager1view(apiview):
  def get(self,request,*args,**kwargs):
    #獲取所有數據
    roles = models.role.objects.all()
    #創建分頁對象
    pg = pagenumberpagination()
    #獲取分頁的數據
    page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
    #對數據進行序列化
    ser = pagerserialiser(instance=page_roles,many=true)
    return response(ser.data)

(4)settings配置

?
1
2
3
4
rest_framework = {
  #分頁
  "page_size":2  #每頁顯示多少個
}

Django rest framework實現分頁的示例

自定義分頁類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#自定義分頁類
class mypagenumberpagination(pagenumberpagination):
  #每頁顯示多少個
  page_size = 3
  #默認每頁顯示3個,可以通過傳入pager1/?page=2&size=4,改變默認每頁顯示的個數
  page_size_query_param = "size"
  #最大頁數不超過10
  max_page_size = 10
  #獲取頁碼數的
  page_query_param = "page"
 
 
class pager1view(apiview):
  def get(self,request,*args,**kwargs):
    #獲取所有數據
    roles = models.role.objects.all()
    #創建分頁對象,這里是自定義的mypagenumberpagination
    pg = mypagenumberpagination()
    #獲取分頁的數據
    page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
    #對數據進行序列化
    ser = pagerserialiser(instance=page_roles,many=true)
    return response(ser.data)

Django rest framework實現分頁的示例

第二種分頁 limitoffsetpagination

自定義

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#自定義分頁類2
class mylimitoffsetpagination(limitoffsetpagination):
  #默認顯示的個數
  default_limit = 2
  #當前的位置
  offset_query_param = "offset"
  #通過limit改變默認顯示的個數
  limit_query_param = "limit"
  #一頁最多顯示的個數
  max_limit = 10
 
 
class pager1view(apiview):
  def get(self,request,*args,**kwargs):
    #獲取所有數據
    roles = models.role.objects.all()
    #創建分頁對象
    pg = mylimitoffsetpagination()
    #獲取分頁的數據
    page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
    #對數據進行序列化
    ser = pagerserialiser(instance=page_roles,many=true)
    return response(ser.data)

Django rest framework實現分頁的示例

Django rest framework實現分頁的示例

返回的時候可以用get_paginated_response方法

自帶上一頁下一頁

Django rest framework實現分頁的示例

Django rest framework實現分頁的示例

第三種分頁cursorpagination

加密分頁方式,只能通過點“上一頁”和下一頁訪問數據

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#自定義分頁類3 (加密分頁)
class mycursorpagination(cursorpagination):
  cursor_query_param = "cursor"
  page_size = 2   #每頁顯示2個數據
  ordering = 'id'  #排序
  page_size_query_param = none
  max_page_size = none
 
class pager1view(apiview):
  def get(self,request,*args,**kwargs):
    #獲取所有數據
    roles = models.role.objects.all()
    #創建分頁對象
    pg = mycursorpagination()
    #獲取分頁的數據
    page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
    #對數據進行序列化
    ser = pagerserialiser(instance=page_roles,many=true)
    # return response(ser.data)
    return pg.get_paginated_response(ser.data)

Django rest framework實現分頁的示例

Django rest framework實現分頁的示例

代碼

版本、解析器、序列化和分頁

?
1
2
3
4
5
6
7
8
9
# myproject2/urls.py
 
from django.contrib import admin
from django.urls import path,include
 
urlpatterns = [
  #path('admin/', admin.site.urls),
  path('api/',include('api.urls') ),
]
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# api/urls.py
 
from django.urls import path,re_path
from .views import userview,paserview,rolesview,userinfoview,groupview,usergroupview
from .views import pager1view
 
urlpatterns = [
  re_path('(?p<version>[v1|v2]+)/users/', userview.as_view(),name = 'api_user'), #版本
  path('paser/', paserview.as_view(),),  #解析
  re_path('(?p<version>[v1|v2]+)/roles/', rolesview.as_view()),   #序列化
  re_path('(?p<version>[v1|v2]+)/info/', userinfoview.as_view()),  #序列化
  re_path('(?p<version>[v1|v2]+)/group/(?p<pk>\d+)/', groupview.as_view(),name = 'gp'),  #序列化生成url
  re_path('(?p<version>[v1|v2]+)/usergroup/', usergroupview.as_view(),),  #序列化做驗證
  re_path('(?p<version>[v1|v2]+)/pager1/', pager1view.as_view(),)  #分頁1
]
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# api/models.py
 
from django.db import models
 
class userinfo(models.model):
  user_type = (
    (1,'普通用戶'),
    (2,'vip'),
    (3,'svip')
  )
 
  user_type = models.integerfield(choices=user_type)
  username = models.charfield(max_length=32,unique=true)
  password = models.charfield(max_length=64)
  group = models.foreignkey('usergroup',on_delete=models.cascade)
  roles = models.manytomanyfield('role')
 
 
class usertoken(models.model):
  user = models.onetoonefield('userinfo',on_delete=models.cascade)
  token = models.charfield(max_length=64)
 
 
class usergroup(models.model):
  title = models.charfield(max_length=32)
 
 
class role(models.model):
  title = models.charfield(max_length=32)
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# api/views.py
import json
 
from django.shortcuts import render,httpresponse
from rest_framework.views import apiview
from rest_framework.request import request
from rest_framework.versioning import urlpathversioning
from . import models
 
##########################################版本和解析器#####################################################
 
class userview(apiview):
 
  def get(self,request,*args,**kwargs):
    #獲取版本
    print(request.version)
    #獲取處理版本的對象
    print(request.versioning_scheme)
    #獲取瀏覽器訪問的url,reverse反向解析
    #需要兩個參數:viewname就是url中的別名,request=request是url中要傳入的參數
    #(?p<version>[v1|v2]+)/users/,這里本來需要傳version的參數,但是version包含在request里面,所有只需要request=request就可以
    url_path = request.versioning_scheme.reverse(viewname='api_user',request=request)
    print(url_path)
    self.dispatch
    return httpresponse('用戶列表')
 
# from rest_framework.parsers import jsonparser,formparser
 
class paserview(apiview):
  '''解析'''
  # parser_classes = [jsonparser,formparser,]
  #jsonparser:表示只能解析content-type:application/json的頭
  #formparser:表示只能解析content-type:application/x-www-form-urlencoded的頭
 
  def post(self,request,*args,**kwargs):
    #獲取解析后的結果
    print(request.data)
    return httpresponse('paser')
 
 
###########################################序列化###########################################################
 
from rest_framework import serializers
 
#要先寫一個序列化的類
class rolesserializer(serializers.serializer):
  #role表里面的字段id和title序列化
  id = serializers.integerfield()
  title = serializers.charfield()
 
class rolesview(apiview):
  def get(self,request,*args,**kwargs):
    # 方式一:對于[obj,obj,obj]
    # (queryset)
    # roles = models.role.objects.all()
    # 序列化,兩個參數,instance:queryset 如果有多個值,就需要加 mangy=true
    # ser = rolesserializer(instance=roles,many=true)
    # 轉成json格式,ensure_ascii=false表示顯示中文,默認為true
    # ret = json.dumps(ser.data,ensure_ascii=false)
 
    # 方式二:
    role = models.role.objects.all().first()
    ser = rolesserializer(instance=role, many=false)
    ret = json.dumps(ser.data, ensure_ascii=false)
    return httpresponse(ret)
 
 
# class userinfoserializer(serializers.serializer):
#   '''序列化用戶的信息'''
#   #user_type是choices(1,2,3),顯示全稱的方法用source
#   type = serializers.charfield(source="get_user_type_display")
#   username = serializers.charfield()
#   password = serializers.charfield()
#   #group.title:組的名字
#   group = serializers.charfield(source="group.title")
#   #serializermethodfield(),表示自定義顯示
#   #然后寫一個自定義的方法
#   rls = serializers.serializermethodfield()
#
#   def get_rls(self,row):
#     #獲取用戶所有的角色
#     role_obj_list = row.roles.all()
#     ret = []
#     #獲取角色的id和名字
#     #以字典的鍵值對方式顯示
#     for item in role_obj_list:
#       ret.append({"id":item.id,"title":item.title})
#     return ret
 
 
# class userinfoserializer(serializers.modelserializer):
#   type = serializers.charfield(source="get_user_type_display")
#   group = serializers.charfield(source="group.title")
#   rls = serializers.serializermethodfield()
#
#   def get_rls(self, row):
#     # 獲取用戶所有的角色
#     role_obj_list = row.roles.all()
#     ret = []
#     # 獲取角色的id和名字
#     # 以字典的鍵值對方式顯示
#     for item in role_obj_list:
#       ret.append({"id": item.id, "title": item.title})
#     return ret
#
#   class meta:
#     model = models.userinfo
#     fields = ['id','username','password','type','group','rls']
 
# class userinfoserializer(serializers.modelserializer):
#   class meta:
#     model = models.userinfo
#     #fields = "__all__"
#     fields = ['id','username','password','group','roles']
#     #表示連表的深度
#     depth = 1
 
 
class userinfoserializer(serializers.modelserializer):
  group = serializers.hyperlinkedidentityfield(view_name='gp',lookup_field='group_id',lookup_url_kwarg='pk')
  class meta:
    model = models.userinfo
    #fields = "__all__"
    fields = ['id','username','password','group','roles']
    #表示連表的深度
    depth = 0
 
 
class userinfoview(apiview):
  '''用戶的信息'''
  def get(self,request,*args,**kwargs):
    users = models.userinfo.objects.all()
    #這里必須要傳參數context={'request':request}
    ser = userinfoserializer(instance=users,many=true,context={'request':request})
    ret = json.dumps(ser.data,ensure_ascii=false)
    return httpresponse(ret)
 
 
class groupserializer(serializers.modelserializer):
  class meta:
    model = models.usergroup
    fields = "__all__"
 
class groupview(apiview):
  def get(self,request,*args,**kwargs):
    pk = kwargs.get('pk')
    obj = models.usergroup.objects.filter(pk=pk).first()
 
    ser = groupserializer(instance=obj,many=false)
    ret = json.dumps(ser.data,ensure_ascii=false)
    return httpresponse(ret)
 
 
 
####################################序列化之用戶請求數據驗證驗證####################################
 
#自定義驗證規則
class groupvalidation(object):
  def __init__(self,base):
    self.base = base
 
  def __call__(self, value):
    if not value.startswith(self.base):
      message = "標題必須以%s為開頭"%self.base
      raise serializers.validationerror(message)
 
 
class usergroupserializer(serializers.serializer):
  title = serializers.charfield(validators=[groupvalidation('以我開頭'),])
 
class usergroupview(apiview):
  def post(self,request,*args, **kwargs):
    ser = usergroupserializer(data=request.data)
    if ser.is_valid():
      print(ser.validated_data['title'])
    else:
      print(ser.errors)
 
    return httpresponse("用戶提交數據驗證")
 
 
##################################################分頁###################################################
 
from api.utils.serializsers.pager import pagerserialiser
from rest_framework.response import response
from rest_framework.pagination import pagenumberpagination,limitoffsetpagination,cursorpagination
 
# #自定義分頁類1
# class mypagenumberpagination(pagenumberpagination):
#   #每頁顯示多少個
#   page_size = 3
#   #默認每頁顯示3個,可以通過傳入pager1/?page=2&size=4,改變默認每頁顯示的個數
#   page_size_query_param = "size"
#   #最大頁數不超過10
#   max_page_size = 10
#   #獲取頁碼數的
#   page_query_param = "page"
 
#自定義分頁類2
class mylimitoffsetpagination(limitoffsetpagination):
  #默認顯示的個數
  default_limit = 2
  #當前的位置
  offset_query_param = "offset"
  #通過limit改變默認顯示的個數
  limit_query_param = "limit"
  #一頁最多顯示的個數
  max_limit = 10
 
 
#自定義分頁類3 (加密分頁)
class mycursorpagination(cursorpagination):
  cursor_query_param = "cursor"
  page_size = 2   #每頁顯示2個數據
  ordering = 'id'  #排序
  page_size_query_param = none
  max_page_size = none
 
 
class pager1view(apiview):
  def get(self,request,*args,**kwargs):
    #獲取所有數據
    roles = models.role.objects.all()
    #創建分頁對象
    pg = mycursorpagination()
    #獲取分頁的數據
    page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
    #對數據進行序列化
    ser = pagerserialiser(instance=page_roles,many=true)
    return response(ser.data)
    # return pg.get_paginated_response(ser.data)
?
1
2
3
4
5
6
7
8
9
10
# api/utils/serializsers/pager.py
 
from rest_framework import serializers
from api import models
 
 
class pagerserialiser(serializers.modelserializer):
  class meta:
    model = models.role
    fields = "__all__"

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/derek1184405959/p/8727595.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲男人网 | 隔壁的漂亮邻居hd中文 | 日韩精选视频 | 俄罗斯13一14处出血视频在线 | 久久精品中文字幕 | 性夜夜春夜夜爽AA片A | 免费看黄色一级 | 日韩一区二区三 | 男人猛进女人屁股免费 | 风间由美理论片在线观看 | 高清一级片 | 私人chinese beauty| 美女口述又粗又大感觉 | 亚洲娇小性hd | 精品一区久久 | 97porm自拍视频区原创 | 第一次处破女18分钟 | 无码区国产区在线播放 | 91精品国产人成网站 | www视频免费 | 欧美同性猛男野外gay免费 | 男人插女人软件 | 暖暖高清日本在线 | 欧美三级做爰全过程 | 国产喂奶300部 | 91系列在线观看免费 | 国产成人精品一区二区仙踪林 | 天天色视频 | 我被黄总征服的全过程 | 午夜在线观看免费观看 视频 | naruto hentai玖辛奈 | 免费看1级伦理 | 好大好爽好硬我要喷水了 | 无码AV毛片色欲欧洲美洲 | 久久黄色小视频 | 国产精品久久久久久久久齐齐 | 免费黄色片网站 | 欧美一区精品 | 特黄一级大片 | 亚洲欧美天堂 | 成人小视频在线观看免费 |