LimitOffsetPagination не работает глобально по умолчанию в универсальном представлении, если оно добавлено в настройки - PullRequest
0 голосов
/ 29 октября 2018

В моем settings.py у меня есть следующий код:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
}

В моем универсальном представлении у меня есть следующий код:

class ChildrenList(generics.ListAPIView):
    permission_classes = [IsAuthenticated]
    serializer_class = CheckItSerializer
    queryset = CheckIt.objects.all().order_by('-id')

    def get(self, request):
        try:
            queryset = CheckIt.objects.filter(box=request.user.userdetail.box_obj.id).order_by('-id')
            serializer = CheckItSerializer(queryset, many=True)
            context = {"success": True, "message": "CheckIt List", "error": "", "data": serializer.data}
            return Response(context, status=status.HTTP_200_OK)
        except Exception as error:
            context = {'error': str(error), 'success': "false", 'message': 'Failed to get CheckIt Details.'}
            return Response(context, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

Если я использую get_queryset () в методе get. Это дает мне все данные этой модели

def get(self, request):
        try:
            queryset = self.get_queryset()
            serializer = CheckItSerializer(queryset, many=True)
            context = {"success": True, "message": "CheckIt List", "error": "", "data": serializer.data}
            return Response(context, status=status.HTTP_200_OK)

Как заставить LimitOffsetPagination работать на всех API, не меняя большую часть API по отдельности

1 Ответ

0 голосов
/ 30 октября 2018

Конечно, это не работает.

Вы переопределили метод get, который вызывает метод списка ListModelMixin, в котором обрабатывается нумерация страниц.

С тех пор как вы это сделали, вам нужно снова самостоятельно выполнить нумерацию страниц.

Если вы посмотрите на ListModelMixin, вы можете найти это

class ListModelMixin(object):
    """
    List a queryset.
    """
    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)

Вы можете черпать вдохновение оттуда, и в вашем get вам нужно вызвать часть, где он разбивает на страницы набор запросов.

...