У меня есть следующее представление на основе классов, которое работает, как ожидается, и разбивает результаты на страницы как требуется с параметрами http://127.0.0.1:8000/api/collection/fromdetroit?page=1
>> ?page=2
и т. Д.
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
)
Однако, он работает невероятно медленно, потому что сначала нужно загрузить ВСЕ результаты, а затем разбить их на страницы. Вот результаты с панели инструментов Django.
Я хотел бы загружать только 60 результатов за раз, так как тысячи результатов возвращены выше.
Настройки пагинации в settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 10
}