Применить пагинацию к необработанному запросу, чтобы предотвратить загрузку ВСЕХ записей - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть следующее представление на основе классов, которое работает, как ожидается, и разбивает результаты на страницы как требуется с параметрами 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.

enter image description here

Я хотел бы загружать только 60 результатов за раз, так как тысячи результатов возвращены выше.

Настройки пагинации в settings.py

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 10
}

1 Ответ

0 голосов
/ 18 сентября 2018

Добавьте свой класс нумерации страниц. создать pagination_class.py.

from rest_framework.pagination import PageNumberPagination


class StandardResultsSetPagination(PageNumberPagination):
    page_size_query_param = 'limit'

Добавьте это в settings.py.

REST_FRAMEWORK = {
    ...
    'DEFAULT_PAGINATION_CLASS': 'app_name.pagination_class.StandardResultsSetPagination',
 ...
}
...