运维开发笔记整理-数据分页
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.创建测试数据(批量创建1000个用户)


C:\Users\yinzhengjie\softwares\GitHub\DevOps>python manage.py shell Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>>
C:\Users\yinzhengjie\softwares\GitHub\DevOps>python manage.py shell Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> >>> from django.contrib.auth.models import User >>> >>> username = "yinzhengjie" >>> >>> for i in range(1000): ... name = "{}_{}".format(username,i) ... User.objects.create_user(name,"{}@yinzhengjie.org.cn".format(name),"123") ... <User: yinzhengjie_0> <User: yinzhengjie_1> <User: yinzhengjie_2> <User: yinzhengjie_3> <User: yinzhengjie_4> <User: yinzhengjie_5> <User: yinzhengjie_6> <User: yinzhengjie_7> <User: yinzhengjie_8> <User: yinzhengjie_9> <User: yinzhengjie_10> <User: yinzhengjie_11> <User: yinzhengjie_12> <User: yinzhengjie_13> <User: yinzhengjie_14> <User: yinzhengjie_15> <User: yinzhengjie_16> <User: yinzhengjie_17> <User: yinzhengjie_18> <User: yinzhengjie_19> <User: yinzhengjie_20> <User: yinzhengjie_21> <User: yinzhengjie_22> <User: yinzhengjie_23> ........


>>> User.objects.all() <QuerySet [<User: yinzhengjie>, <User: admin>, <User: chenfei>, <User: jenny>, <User: yinzhengjie_0>, <User: yinzhengjie_1>, <User: yinzhengjie_2>, <User: yinzhengjie_3>, <User: yinzhengjie_4>, <User: yinzhengjie_5>, <User: yinzhengjie_6>, <User: yinzhengjie_7>, <User: yinzhengjie_8>, <User: yinzhengjie _9>, <User: yinzhengjie_10>, <User: yinzhengjie_11>, <User: yinzhengjie_12>, <User: yinzhengjie_13>, <User: yinzhengjie_14>, <User: yinzhengjie_15>, '...(remaining elements truncated)...']> >>>


>>> User.objects.all()[:10]
<QuerySet [<User: yinzhengjie>, <User: admin>, <User: chenfei>, <User: jenny>, <User: yinzhengjie_0>, <User: yinzhengjie_1>, <User: yinzhengjie_2>, <User: yinzhengjie_3>, <User: yinzhengjie_4>, <User: yinzhengjie_5>]>
>>>


>>> queryset = User.objects.all()[:10] >>> >>> queryset.values() <QuerySet [{'id': 1, 'password': 'pbkdf2_sha256$36000$mpkI6GLbFQxO$92QgD28jd838LlgzTsnFsvw+2CbTAgK+LgzS3G40h/k=', 'last_login': datetime.datetime(2019, 1, 14, 8, 7, 20, tzinfo=<UTC>), 'is_superuser': False, 'username': 'yinzhengjie', 'first_name': '', 'last_name': '', 'email': 'yinzhengjie@yinzhengjie.o rg.cn', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2019, 1, 9, 13, 3, 26, tzinfo=<UTC>)}, {'id': 2, 'password': 'pbkdf2_sha256$36000$AJNnOcpMRfAB$wvsTcO221K9c/ogSIW8WuK4ti4iRbVp6LliFJnq0PlA=', 'last_login': None, 'is_superuser': True, 'username': 'admin', 'first_name': '', 'l ast_name': '', 'email': 'admin@yinzhengjie.org.cn', 'is_staff': True, 'is_active': True, 'date_joined': datetime.datetime(2019, 1, 9, 13, 7, 43, tzinfo=<UTC>)}, {'id': 3, 'password': 'pbkdf2_sha256$36000$9xEXixjbrwgW$VRE2gdFRjnI6E3mc4nor3rUqBP97wai8xqulzgRnwPQ=', 'last_login': datetime.datetime(2019, 1,11, 9, 54, 22, tzinfo=<UTC>), 'is_superuser': False, 'username': 'chenfei', 'first_name': '', 'last_name': '', 'email': 'chenfei@yinzhengjie.org.cn', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2019, 1, 11, 9, 24, 6, tzinfo=<UTC>)}, {'id': 4, 'password': 'pbkdf2_sha256$36000$ Frpw9hmKTaKa$B4dVdqiM4K+2yFLd3DfQV74mv2tllwnZxjJPFjhEh2A=', 'last_login': datetime.datetime(2019, 1, 11, 9, 35, 32, tzinfo=<UTC>), 'is_superuser': True, 'username': 'jenny', 'first_name': '', 'last_name': '', 'email': '', 'is_staff': True, 'is_active': True, 'date_joined': datetime.datetime(2019, 1, 11,9, 35, 17, tzinfo=<UTC>)}, {'id': 5, 'password': 'pbkdf2_sha256$36000$Igzct2aN2kIn$KJUA3qbjZYT8Mz8UubgptT425CrAZI3lr1L47tOYnKA=', 'last_login': None, 'is_superuser': False, 'username': 'yinzhengjie_0', 'first_name': '', 'last_name': '', 'email': 'yinzhengjie_0@yinzhengjie.org.cn', 'is_staff': False, 'i s_active': True, 'date_joined': datetime.datetime(2019, 1, 15, 6, 39, 47, tzinfo=<UTC>)}, {'id': 6, 'password': 'pbkdf2_sha256$36000$pVgOfvV7xnLA$v/HdnmOrON5yXQm6Tu/ESQLExwzsDLS1HYmB420STw0=', 'last_login': None, 'is_superuser': False, 'username': 'yinzhengjie_1', 'first_name': '', 'last_name': '', 'ema il': 'yinzhengjie_1@yinzhengjie.org.cn', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2019, 1, 15, 6, 39, 47, tzinfo=<UTC>)}, {'id': 7, 'password': 'pbkdf2_sha256$36000$AcBse0DrqytQ$UDTl3i8wozYnEcRCanRcTxF06sQCdW4ezDNDDOBW6Iw=', 'last_login': None, 'is_superuser': False, 'usern ame': 'yinzhengjie_2', 'first_name': '', 'last_name': '', 'email': 'yinzhengjie_2@yinzhengjie.org.cn', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2019, 1, 15, 6, 39, 47, tzinfo=<UTC>)}, {'id': 8, 'password': 'pbkdf2_sha256$36000$hkSzLweU5YB1$TNwHHuQ3X+4s2bw31yLc1oxYfo+2OhE0CR FQrZi6QtA=', 'last_login': None, 'is_superuser': False, 'username': 'yinzhengjie_3', 'first_name': '', 'last_name': '', 'email': 'yinzhengjie_3@yinzhengjie.org.cn', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2019, 1, 15, 6, 39, 47, tzinfo=<UTC>)}, {'id': 9, 'password': 'pbkdf 2_sha256$36000$9MCEySYs7ioI$XlA3AAUeOYY+IbGEREQTLMEHyulzcenEDRgKTzUlUns=', 'last_login': None, 'is_superuser': False, 'username': 'yinzhengjie_4', 'first_name': '', 'last_name': '', 'email': 'yinzhengjie_4@yinzhengjie.org.cn', 'is_staff': False, 'is_active': True, 'date_joined': datetime.datetime(2019, 1, 15, 6, 39, 47, tzinfo=<UTC>)}, {'id': 10, 'password': 'pbkdf2_sha256$36000$LWtenjjciVrx$OY49hPmpRJwqrxtyb16MY8vbWz9tZtgqUiF72obodyQ=', 'last_login': None, 'is_superuser': False, 'username': 'yinzhengjie_5', 'first_name': '', 'last_name': '', 'email': 'yinzhengjie_5@yinzhengjie.org.cn', 'is_staff': Fa lse, 'is_active': True, 'date_joined': datetime.datetime(2019, 1, 15, 6, 39, 47, tzinfo=<UTC>)}]> >>>


C:\Users\yinzhengjie\softwares\GitHub\DevOps>python manage.py shell Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> >>> from django.contrib.auth.models import User >>> >>> queryset = User.objects.all()[:10] >>> >>> queryset.values("username","email") <QuerySet [{'username': 'yinzhengjie', 'email': 'yinzhengjie@yinzhengjie.org.cn'}, {'username': 'admin', 'email': 'admin@yinzhengjie.org.cn'}, {'username': 'chenfei', 'email': 'chenfei@yinzhengjie.org.cn'}, {'username': 'jenny', 'email': ''}, {'username': 'yinzhengjie_0', 'email': 'yinzhengjie_0@yinzhen gjie.org.cn'}, {'username': 'yinzhengjie_1', 'email': 'yinzhengjie_1@yinzhengjie.org.cn'}, {'username': 'yinzhengjie_2', 'email': 'yinzhengjie_2@yinzhengjie.org.cn'}, {'username': 'yinzhengjie_3', 'email': 'yinzhengjie_3@yinzhengjie.org.cn'}, {'username': 'yinzhengjie_4', 'email': 'yinzhengjie_4@yinzhen gjie.org.cn'}, {'username': 'yinzhengjie_5', 'email': 'yinzhengjie_5@yinzhengjie.org.cn'}]> >>>


C:\Users\yinzhengjie\softwares\GitHub\DevOps>python manage.py shell Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> >>> from django.contrib.auth.models import User >>> >>> queryset = User.objects.all()[:10] >>> >>> queryset.values("username","email") <QuerySet [{'username': 'yinzhengjie', 'email': 'yinzhengjie@yinzhengjie.org.cn'}, {'username': 'admin', 'email': 'admin@yinzhengjie.org.cn'}, {'username': 'chenfei', 'email': 'chenfei@yinzhengjie.org.cn'}, {'username': 'jenny', 'email': ''}, {'username': 'yinzhengjie_0', 'email': 'yinzhengjie_0@yinzhen gjie.org.cn'}, {'username': 'yinzhengjie_1', 'email': 'yinzhengjie_1@yinzhengjie.org.cn'}, {'username': 'yinzhengjie_2', 'email': 'yinzhengjie_2@yinzhengjie.org.cn'}, {'username': 'yinzhengjie_3', 'email': 'yinzhengjie_3@yinzhengjie.org.cn'}, {'username': 'yinzhengjie_4', 'email': 'yinzhengjie_4@yinzhen gjie.org.cn'}, {'username': 'yinzhengjie_5', 'email': 'yinzhengjie_5@yinzhengjie.org.cn'}]> >>> >>> list(queryset.values("username","email")) [{'username': 'yinzhengjie', 'email': 'yinzhengjie@yinzhengjie.org.cn'}, {'username': 'admin', 'email': 'admin@yinzhengjie.org.cn'}, {'username': 'chenfei', 'email': 'chenfei@yinzhengjie.org.cn'}, {'username': 'jenny', 'email': ''}, {'username': 'yinzhengjie_0', 'email': 'yinzhengjie_0@yinzhengjie.org.c n'}, {'username': 'yinzhengjie_1', 'email': 'yinzhengjie_1@yinzhengjie.org.cn'}, {'username': 'yinzhengjie_2', 'email': 'yinzhengjie_2@yinzhengjie.org.cn'}, {'username': 'yinzhengjie_3', 'email': 'yinzhengjie_3@yinzhengjie.org.cn'}, {'username': 'yinzhengjie_4', 'email': 'yinzhengjie_4@yinzhengjie.org.c n'}, {'username': 'yinzhengjie_5', 'email': 'yinzhengjie_5@yinzhengjie.org.cn'}] >>>
二.文档浏览器(mac和windows文档)
1>.window登录官网(https://devdocs.io)
2>.mac文档(https://kapeli.com/dash)
该文档需要授权,因为它是收费的。
关于paginator的文档,详情请参考:https://devdocs.io/django~1.11/topics/pagination#django.core.paginator.Paginator 。
关于page的文档,详情请参考:https://devdocs.io/django~1.11/topics/pagination#django.core.paginator.Page。
三.数据分页原理案例
dashboard的url.py配置文件,如下图所示:
#!/usr/bin/env python #_*_conding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/from django.conf.urls import url from . import viewsurlpatterns = [url(r"^login/",views.LoginView.as_view()),url(r"^index/", views.MyPageView.as_view()), ]
编写对应的views.py配置文件:
#!/usr/bin/env python #_*_conding:utf-8_*_ #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/from django.http import HttpResponse,JsonResponse from django.shortcuts import render from django.views import View from django.contrib.auth.models import Userclass LoginView(View):def get(self,request):return render(request,"login.html")def post(self,request):print("调用了POST方法!")return HttpResponse("post...")class MyPageView(View):def get(self,request,*args,**kwargs):#定义每个页码显示信息的条数Number_of_per_page = 10try:#获取到用户传递过来的查询页码page = int(request.GET.get("page",1))except:#如果用户没有传递要查询的页码,我们这里给其设置一个默认值1,即显示第一页。page = 1#定义查询的起始位置end = page * 10start = end - 10#定义查询的语句,注意这里并没有去数据库直接查询语句,这里只是定义好了要查询的SQL语句queryset = User.objects.all()[start:end]#触发SQL语句,并将查询的结果转换成JSON格式data = list(queryset.values("id","username","email"))return JsonResponse(data,safe=False)
通过浏览器访问,如下图所示:
四.Paginator和Page
1>.Paginator
C:\Users\yinzhengjie\softwares\GitHub\DevOps>python manage.py shell Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> >>> from django.core.paginator import Paginator >>>>>> from django.contrib.auth.models import User >>> >>> queryset = User.objects.all() >>> >>> paginator = Paginator(queryset,20) #实例化Paginator对象,下面的提示可以不用处理,说是咱们没有对数据进行排序 <string>:1: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'django.contrib.auth.models.User'> QuerySet. >>>


>>> paginator.count
1004
>>>


>>> paginator.num_pages
51
>>>


>>> paginator.page_range range(1, 52) >>>
2>.Page方法
>>> paginator.page(10)
<Page 10 of 51>
>>>


>>> page = paginator.page(10) >>> >>> page.object_list <QuerySet [<User: yinzhengjie_176>, <User: yinzhengjie_177>, <User: yinzhengjie_178>, <User: yinzhengjie_179>, <User: yinzhengjie_180>, <User: yinzhengjie_181>, <User: yinzhengjie_182>, <User: yinzhengjie_183>, <User: yinzhengjie_184>, <User: yinzhengjie_185>, <User: yinzhengjie_186>, <User: yinzhengjie _187>, <User: yinzhengjie_188>, <User: yinzhengjie_189>, <User: yinzhengjie_190>, <User: yinzhengjie_191>, <User: yinzhengjie_192>, <User: yinzhengjie_193>, <User: yinzhengjie_194>, <User: yinzhengjie_195>]> >>>


>>> page.number
10
>>>


>>> page.paginator
<django.core.paginator.Paginator object at 0x0000000003BED2E8>
>>>


>>> page.has_next()
True
>>>


>>> page.has_previous()
True
>>>


>>> page.has_other_pages()
True
>>>


>>> page.next_page_number()
11
>>>


>>> page.previous_page_number()
9
>>>


>>> page.start_index()
181
>>>


>>> page.end_index()
200
>>>