代码之家  ›  专栏  ›  技术社区  ›  Axil

Django分页超过页面限制,显示最后一个结果

  •  0
  • Axil  · 技术社区  · 7 年前

    我有一个基于Django函数的API,可以输入页码和每页的大小。这是我的密码。

    @api_view(['POST'])
    def attendance_all_get_list_by_page(request):
        # ----- YAML below for Swagger -----
        """
        description: attendance_all_get_list_by_page
        parameters:
          - name: page
            type: integer
            required: true
            location: form   
          - name: page_limit
            type: integer
            required: true
            location: form                   
        """
        attendance_list = Attendance.objects.all().order_by('id') 
    
        page = request.GET.get('page', request.POST['page'])
        paginator = Paginator(attendance_list, request.POST['page_limit'])
    
        try:
            attendances = paginator.page(page)
        except PageNotAnInteger:
            attendances = paginator.page(request.POST['page'])
        except EmptyPage:
            attendances = paginator.page(paginator.num_pages)
    
    
        serializer = AttendanceSerializer(list(attendances), many=True)
        data = serializer.data[:]
        return Response(data, status=status.HTTP_200_OK)  
    

    我的序列化程序:

    class EmployeeSerializer(serializers.ModelSerializer):
        class Meta:
            model = Employee
            fields = ("id", "username")
    
    class AttendanceSerializer(serializers.ModelSerializer):
        employee = EmployeeSerializer(many=False, read_only=True)
    
        class Meta:
            model = Attendance
            fields = ('id','employee','created_at')
    

    假设我有

    16,17,18,19
    

    因此,例如,当page=2 page\u limit=2时,它将显示以下内容(这应该是4条记录的最后一页)

    [
      {
        "id": 18,
        "employee": {
          "id": 16,
          "username": "haha"
        },
        "created_at": "2017-12-28T03:29:29.698339Z"
      },
      {
        "id": 19,
        "employee": {
          "id": 16,
          "username": "haha"
        },
        "created_at": "2017-12-28T03:38:53.639749Z"
      }
    ]
    

    如果我这样做了(page=3 page\u limit=2)或(page=10 page\u limit=2),它仍将显示

    [
    {
    “id”:18,
    “员工”:{
    “id”:16,
    “用户名”:“哈哈”
    },
    “created\u at”:“2017-12-28T03:29:29.698339Z”
    },
    {
    “id”:19,
    “员工”:{
    “id”:16,
    “用户名”:“哈哈”
    },
    “created\u at”:“2017-12-28T03:38:53.639749Z”
    }
    ]
    

    预期结果应为

    []
    

    我的分页有什么问题,上一页有什么东西在影响我。我想让最后一页显示最后一页的结果,但之后应该是空记录列表。

    1 回复  |  直到 7 年前
        1
  •  0
  •   neverwalkaloner    7 年前

    捕获EmptyPage并返回最后一页内容。所以,如果你超出了范围,你每次都会看到第二页。 在这种情况下,您需要返回空列表:

    except EmptyPage:
        attendances = []