Я написал класс нумерации страниц, как показано ниже, для API ListView.

class PhotoListPagination(PageNumberPagination):
   page_size = 100
   page_size_query_param = 'page_size'
   max_page_size = 10000

И использовать его в моем представлении API как pagination_class:

class UserSinglePhotoAPIView(ListAPIView):
    model = Photo
    serializer_class = PhotoSerializer
    pagination_class = PhotoListPagination

    def get_queryset(self):
        return Profile.objects.get(auth_user__username=self.kwargs['username']).get_single_photos()

Поскольку я отправляю запрос GET на /link/to/my/API/end-point?page=1 или на любой другой номер страницы, он работает очень хорошо. в настоящее время, когда page не имеет значения (отправка запроса на /link/to/my/API/end-point), отображается страница 1. Но мне нужно получить все результаты без разбивки на страницы, если я не установил ключ page в запросе.

Является ли это возможным?

Любая помощь будет оценена.

0
SirSaleh 24 Сен 2018 в 10:22

2 ответа

Лучший ответ

Это метод paginate_queryset в общих представлениях,

def paginate_queryset(self, queryset):
    """
    Return a single page of results, or `None` if pagination is disabled.
    """
    if self.paginator is None:
        return None
    return self.paginator.paginate_queryset(queryset, self.request, view=self

Поэтому, если эта функция возвращает None, ListView вернет одну страницу, включая все результаты, поэтому переопределите этот метод, как показано ниже:

class UserSinglePhotoAPIView(ListAPIView):
    ...
    ...
    def paginate_queryset(self, queryset):
        if self.paginator and self.request.query_params.get(self.paginator.page_query_param, None) is None:
            return None
        return super().paginate_queryset(queryset)
1
Ehsan Nouri 24 Сен 2018 в 08:02

Вы можете переопределить метод list в своем UserSinglePhotoAPIView и выполнить разбиение на страницы только тогда, когда указан параметр запроса страницы. В противном случае верните все.

Что-то вроде этого:

def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())

    if 'page' in request.query_params:
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

    serializer = self.get_serializer(queryset, many=True)
    return Response(serializer.data)
1
Enthusiast Martin 24 Сен 2018 в 08:00