pythondjangodjango-rest-frameworkdjango-viewsdjango-pagination

Pagination does not seem to be working in Django rest api with GET method


I have been trying to paginate by json response but in vain. below are my code snippets.

views.py

This gives me the entire result. The reason i'm converting to a dataframe is that i want to do some data cleaning and minipulation.

class LogsNewAPI(APIView):
pagination_class=CustomPagination
def get(self,request, *args, **kwargs):
    envid = self.kwargs.get('envid')
    nodeid = self.kwargs.get('nodeid')
    startdatetime = self.request.GET.get('startdatetime')
    enddatetime = self.request.GET.get('enddatetime')

    filter_list=PegaAlerts.objects.filter(envId=envid, serverId=nodeid, generateddatetime__lte=enddatetime, generateddatetime__gte=startdatetime,).order_by('generateddatetime')
    df = read_frame(filter_list)
    json = df[['generateddatetime','msgid','fullLine']].to_json(orient='records',date_format='iso')
    return HttpResponse(json, content_type = 'application/json')

i have also tried as below and that gives the error:

LogsAPI requires either a 'template_name' attribute or a get_queryset() method that returns a QuerySet

class LogsAPI(ListView):
pagination_class=CustomPagination
def get_queryset(self):
    startdatetime = self.request.GET.get('startdatetime')
    enddatetime = self.request.GET.get('enddatetime')
    filter_list=Alerts.objects.filter(envId=self.kwargs['envid'], serverId=self.kwargs['nodeid'], generateddatetime__lte=enddatetime, generateddatetime__gte=startdatetime,).order_by('generateddatetime')
    df = read_frame(filter_list)
    json = df[[
                  'generateddatetime','msgid','fullLine']].to_json(orient='records',date_format='iso')
    return HttpResponse(json, content_type = 'application/json')

pagination.py

class CustomPagination(pagination.PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
page_query_param = 'page_number'

urls.py

url(r'^api/v1/servers/(?P<envid>\d+)/(?P<nodeid>\d+)/logs/alerts/logs/$',views.LogsNewAPI.as_view(),name='LogsNewAPI'),

request from postman

http://xxxx:xxxx/api/v1/servers/1/1/logs/alerts/logs/?page_size=3&page_number=2&startdatetime=2023-01-08 10:00:00&enddatetime=2023-01-08 15:00:00

not sure if I'm missing something. Any suggestions or redirection would be of great help..Thanks!!


Solution

  • Adding a serializer class helped resolve the problem.

    class LogsNewAPI(GenericAPIView):
            pagination_class=CustomPagination
            serializer_class = AlertsSerializer
            def get(self,request, *args, **kwargs):
                envid = self.kwargs.get('envid')
                nodeid = self.kwargs.get('nodeid')
                startdatetime = self.request.GET.get('startdatetime')
                enddatetime = self.request.GET.get('enddatetime')
                filter_list=PegaAlerts.objects.filter(envId=envid, serverId=nodeid, generateddatetime__lte=enddatetime, generateddatetime__gte=startdatetime,).order_by('generateddatetime')
                page = self.paginate_queryset(filter_list)
                serializer = AlertsSerializer(page, many=True)
                return Response(serializer.data, status=status.HTTP_200_OK)