Ограничение элементов на страницу в Django Rest Framework

каков наилучший способ ограничить элементы на странице в Django Rest Framework? Я установил PAGINATE_BY = 20 и PAGINATE_BY_PARAM. Без параметра вы получаете 20 элементов, но также можно получить 4000 элементов по paginate param. Эти запросы очень тяжелые и не очень полезные, но идеально подходят для скриптовых детишек.

Jarus

4 ответов


Если вы хотите установить жесткий максимальный предел, посмотрите на переопределение get_paginate_by метод для общих представлений.


необходимо указать PAGINATE_BY as doc гласит:

PAGINATE_BY: размер страницы по умолчанию для разбиения на страницы. Если установлено Нет, разбиение на страницы отключено по умолчанию

PAGINATE_BY_PARAM для пользователей, чтобы изменить размер по умолчанию. Поэтому, если вы боитесь его неправильного использования, просто не включайте его.

PAGINATE_BY_PARAM: имя параметра запроса, который может использоваться клиент для переопределения размер страницы по умолчанию для разбиения на страницы. Если значение None, клиенты не могут переопределять размер страницы по умолчанию.


Set 'MAX_PAGINATE_BY' настройка глобальные максимальные результаты на страницу, как doc государства.

пример doc:

REST_FRAMEWORK = {
    'PAGINATE_BY': 10,                 # Default to 10
    'PAGINATE_BY_PARAM': 'page_size',  # Allow client to override, using `?page_size=xxx`.
    'MAX_PAGINATE_BY': 100             # Maximum limit allowed when using `?page_size=xxx`.
}

Set max_paginate_by настройка на посмотреть основа для жесткого максимального ограничения на страницу.

пример из doc:

class PaginatedListView(ListAPIView):
    queryset = ExampleModel.objects.all()
    serializer_class = ExampleModelSerializer
    paginate_by = 10
    paginate_by_param = 'page_size'
    # Set MAX results per page
    max_paginate_by = 100

лучше пройти пагинации

на PageNumberPagination класса включает в себя ряд attributes это может быть переопределено для изменения стиля разбиения на страницы.

class ItemSetPagination(PageNumberPagination):
     page_size = 1000
     page_size_query_param = 'page_size'
     max_page_size = 10000

pagination_class = ItemSetPagination