一、使用场景:
在群查的时候,需要使用到我们的分页功能。但是有些时候,表中的数据很多,且我们需要的是表中指定的部分数据,而不是所有数据都需要查询。例如学生表,我们要查某个班级的所有学生,显示的时候要进行分页。这个时候我们的queryset=models.User.objects.all()就不适用了。
目录结构:
模型类设计:
用户表:用户名、密码、学号、班级、role(角色:学生、老师)
班级表:班级号、位置
我们要拿到同一个班级的所有学生,所有我们的queryset=models.User.objects.filter(班级=,role=学生)
不能再使用:queryset=models.User.objects.all()
序列化设计:
使用Serverializers和ModelServerialzler都可以。
二、重写django的分页器:pagination.py
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
class PageNumberPaginations(PageNumberPagination):
page_size=2#每页数据量
page_query_param='page'#?page=1跳转页
max_page_size= 10 #每页最大数据量
page_size_query_param='size'
#重写这个,是更改该函数的返回格式
def get_paginated_response(self, data):
return Response({
'links': {
'next': self.get_next_link(),
'previous': self.get_previous_link()
},
'count': self.page.paginator.count,
'results': data})
三、重写视图类
from .pagination import PageNumberPaginations #导入重写的分页器类
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin
class StudentClassView(GenericViewSet,ListModelMixin):
queryset = models.User.objects.filter(role=4)#这个在这里可写可不写,因为不会用到
serializer_class = serializer.StudentsSerializer #学生的序列化器
pagination_class = PageNumberPaginations #使用重写的分页器
#重写ListModelMixin类中的list方法
def list(self, request, *args, **kwargs):
user = models.User.objects.get(id=request.auth.get('id'))
if user.role!=4:
return ApiResponse(code=104,msg='学生才能操作')
#拿到指定的数据对象,下面的代码就使用原生的即可
queryset = models.User.objects.filter(stuclass=user.stuclass,role=4)
#上面的是重写的部分,用来获取指定的数据和一些简单逻辑判断
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
路由配置:使用自动生成路由的方式
from rest_framework import routers
from . import views
rou = routers.SimpleRouter()
#带分页功能的查询
rou.register('pagestudens',views.StudentClassView,'pagestudents')
urlpatterns = [
]
urlpatterns+=rou.urls
四、业务流程介绍:
1、学生输入用户和密码登录后,会生成token
2、当学生点击获取班级信息时,会将token传递到后端
3、后端拿到token进行解析,拿到学生的id和学生的用户名
4、通过学生id拿到当前学生所在班级,拿到班级对象
5、通过班级对象,到用户表只查询,所有是该班级的学生。
6、对当前学生所在班级的所有学生进行分页操作。