当先锋百科网

首页 1 2 3 4 5 6 7

一、使用场景:

在群查的时候,需要使用到我们的分页功能。但是有些时候,表中的数据很多,且我们需要的是表中指定的部分数据,而不是所有数据都需要查询。例如学生表,我们要查某个班级的所有学生,显示的时候要进行分页。这个时候我们的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、对当前学生所在班级的所有学生进行分页操作。