Как ограничить результаты запроса с помощью фильтров Django Rest

Я работаю над API, созданным с помощью Django Rest Framework. Я определил несколько классов model, а также создал несколько фильтров для применения к определенным запросам, которые происходят в указанном api-endpoints.

Я пытаюсь применить LIMIT в queryset, но я бы предпочел не использовать нотацию Django, например. Entry.objects.all()[:5]. Вместо этого я хотел бы иметь возможность применять ограничение внутри фильтра, связанного с моделью.

До сих пор я не нашел никакого решения. Я думаю, что мне следует найти способ определить фильтр со значением по умолчанию, чтобы не ограничивать набор запросов, и если запрос достигает конечной точки и содержит что-то вроде ?filter=10, тогда набор запросов должен быть ограничен первыми 10.


person LetsPlayYahtzee    schedule 03.11.2015    source источник


Ответы (3)


Вы можете использовать разбиение на страницы Django Rest Framework. Pagination_class LimitOffsetPagination дает вам возможность ограничить количество возвращаемых записей в query_param.

http://www.django-rest-framework.org/api-guide/pagination/

person Guillaume Pannatier    schedule 03.11.2015
comment
Это очень близко к тому, что мне действительно нужно! Хотя в этом случае я хотел бы переопределить класс LimitOffsetPagination и присвоить параметру offset значение по умолчанию (вероятно, 0), чтобы пользователю нужно было указать только параметр limit. Я думаю использовать PageNumberPagination и переопределить параметр page_size_query_param, чтобы иметь значение по умолчанию limit. Это звучит разумно? - person LetsPlayYahtzee; 04.11.2015
comment
Да, это хорошее решение. Как указано в документации, параметр page_size_query_param можно использовать, чтобы клиент мог контролировать размер страницы запроса. В PageNumberPagination для этого параметра по умолчанию установлено значение None. - person Guillaume Pannatier; 04.11.2015
comment
Это может звучать глупо, но я не могу понять, где разместить пользовательский класс разбивки на страницы. - person LetsPlayYahtzee; 04.11.2015
comment
У вас есть два варианта. Вы можете указать класс пагинации по умолчанию в настройках DEFAULT_PAGINATION_CLASS в разделе настроек REST_FRAMEWORK. Для просмотра с помощью атрибута класса pagination_class и укажите свой подкласс. - person Guillaume Pannatier; 04.11.2015
comment
Но где мне разместить код класса пагинации? (я имею в виду первый вариант) - person LetsPlayYahtzee; 04.11.2015
comment
При первом выборе вам нужно указать значение в settings.py вашего проекта. - person Guillaume Pannatier; 04.11.2015
comment
Давайте продолжим обсуждение в чате. - person LetsPlayYahtzee; 04.11.2015

Вы можете расширить или настроить классы нумерации страниц, доступные в drf.

  class UserSpecificPagination(LimitOffsetPagination):
      def get_limit(self, request):
          if logic_met(request.user):
            self.max_limit = custom_limit
      return super(UserSpecificPagination, self).get_limit(request)

установите класс как pagination_class в настройках ListAPIView или DRF

person Renjith Thankachan    schedule 15.11.2017

вы должны использовать API разбиения на страницы из django-rest

http://www.django-rest-framework.org/api-guide/pagination/

посмотрите на вариант limit

person Ward    schedule 03.11.2015