I have the following class based view that works as expected and paginates the results as required with parameters http://127.0.0.1:8000/api/collection/fromdetroit?page=1
>> ?page=2
etc
class ListReleasesCollectionView(APIView):
def get(self, request, format=None, *args, **kwargs):
try:
releases = ReleasesAll.objects.raw('SELECT releases.*, \'\' as num FROM releases_all releases INNER JOIN release_artists ra ON ra.release_id=releases.id LEFT JOIN genre_artists ON genre_artists.artist=ra.artists LEFT JOIN genre_labels ON genre_labels.label=releases.label_no_country WHERE genre_artists.genre=%s OR genre_labels.genre=%s GROUP by releases.id ORDER BY releases.date DESC',(kwargs['collection'],kwargs['collection']))
paginator = PageNumberPagination()
result_page = paginator.paginate_queryset(releases, request)
serializer = ReleasesSerializer(result_page, many=True, context={'request': request})
response = Response({'results':{'image_url':'', 'page_header':'','releases': serializer.data}}, status=status.HTTP_200_OK)
return response
except ReleasesAll.DoesNotExist:
return Response(
data = {
"message": "{} does not exist".format(kwargs["collection"])
},
status=status.HTTP_404_NOT_FOUND
)
However, it runs incredibly slowly because it has to download ALL results first and then paginate after. Here are the results from Django Toolbar.
I would like to only download 60 results at a time as there are thousands of results returned above.
Pagination settings in settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 10
}