国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品成人国产乱一区 | 成人精品免费视频 | 日本中文字幕一区 | 国产亚洲精品精品国产亚洲综合 | 成人久久久 | 日韩视频在线一区二区 | 97精品一区二区三区 | 国产高清精品在线 | 欧美日韩电影一区二区 | 亚洲三级网站 | 国产精品视频播放 | 欧州一级片 | 国产高清一区二区三区 | 干干干操操操 | av午夜电影 | 亚洲 精品 综合 精品 自拍 | 亚洲成人精品 | 久久精品青青大伊人av | 激情婷婷 | 五月天婷婷社区 | 亚洲日本va中文字幕 | 在线播放中文字幕 | 精品一二三区 | 日韩超级大片免费看国产国产播放器 | 欧美黑人一级爽快片淫片高清 | 黄a在线| 亚洲成人免费网址 | 亚洲国产精品久久久久婷婷老年 | 亚洲精品久久久久久久久久久 | 久久久久久久av | 久久男人 | 亚洲国产精品99久久久久久久久 | 日本三级精品视频 | 波多野结衣中文字幕一区二区三区 | 日韩成人免费av | 欧美日韩国产在线播放 | 爱操在线| 91久久综合亚洲鲁鲁五月天 | 97久久香蕉国产线看观看 | 婷婷精品久久久久久久久久不卡 | 国产免费av网站 |