Пользовательская пагинация лимита и страницы в Django Rest Framework

Я хотел создать пользовательские пагинации для этого get_queryset.

get_queryset = Comments.objects.filter(language_post_id=post_in_lang_id,is_post_comment=True).order_by('-created_on')[offset:offset+limit]

Я хочу изменять значение offset всякий раз, когда обновляется page_no. Предположим, кто-то вводит page_no=1, поэтому offset должно быть 0, а когда вводится 2, то offset должно быть 10, и так далее. Каждый раз, когда page_no обновляется, он должен обновлять значение offset соответственно.

  • как ?page_no=3:
get_queryset = Comments.objects.filter(language_post_id=post_in_lang_id,is_post_comment=True).order_by('-created_on')[offset:offset+limit] # [ 20 : 20 + 10 ]

Полагаю, вы хотите сделать это в ListAPIView. Если это так, вы можете сделать это очень просто, используя PageNumberPagination.
Просто определите размер страницы и нужный вам параметр page_query_param, и метод по умолчанию paginate_queryset() позаботится обо всем за вас, вам не придется переопределять его или вычислять смещение самостоятельно.

# pagination.py
from rest_framework.pagination import PageNumberPagination

class CustomPagination(PageNumberPagination):
    # Returns 10 elements per page, and the page query param is named "page_no"
    page_size = 10
    page_query_param = 'page_no'


# views.py
from rest_framework.generics import ListAPIView
from my_app.pagination import CustomPagination

class MyListView(ListAPIView):
    pagination_class = CustomPagination
    serializer_class = CommentSerializer
    
    def get_queryset(self): 
        post_in_lang_id = '1'  # Retrieve your post_in_lang_id here
        return Comments.objects.filter(language_post_id=post_in_lang_id,is_post_comment=True).order_by('-created_on')

Вы также можете установить его в качестве пагинатора по умолчанию, определив DEFAULT_PAGINATION_CLASS в вашем файле настроек.

Вот макет того, что вы получите в качестве результата для первой страницы, используя этот метод :

{
    "count": 20,
    "previous": null,
    "next": "http://localhost:8000/api/comments/?page_no=2",
    "results": [  # List of first 10 elements
        {
            "id": 1,
            [...]
        },
        [...]
        {
            "id": 10,
            [...]
        },
    ]
}
Вернуться на верх