APIView分页 - DRF

时间:2018-01-02 13:22:52

标签: python pagination django-rest-framework

使用DRF的APIView创建分页时遇到问题。我在某些地方看到用APIView进行分页并不是那么简单,下面的代码是在我的搜索中得到的,但是,我仍然遇到麻烦。其中之一就是我不知道如何为每个请求传递最少数量的结果。另一个是页面编号没有出现或者后面有下一页。

class MerchantOrders(APIView):

authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)

def get(self, request, pk):

    orders = Order.objects.filter(merchant_id=pk)

    paginator = LimitOffsetPagination()

    result_page = paginator.paginate_queryset(orders, request)

    response = ListOrderSerializer(result_page, many=True)
    return Response(response.data)

这是一个回归的例子

[
{
    "product": {
        "id": 4,
        "name": "Blusa #889",
        "barcode": "8880",
        "description": "Maecenas vestibulum imperdiet dapibus. Proin semper tortor lectus, nec lacinia felis fringilla et."
    },
    "price": "16.00",
    "is_ative": true
},
{
    "product": {
        "id": 5,
        "name": "Blusa #915",
        "barcode": "4238",
        "description": "Donec euismod pulvinar condimentum."
    },
    "price": "12.00",
    "is_ative": true
}

我不知道这是否正常,因为我使用过LimitOffsetPagination或者我做错了。我问如果您有更好的使用API​​View进行分页的解决方案,请随时与我分享。

1 个答案:

答案 0 :(得分:1)

Django REST框架源代码是你的朋友。 在您的情况下,您可以从list implementation

中看到一些部分
def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())

    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)