Как реализовать пользовательское упорядочивание с пагинацией курсора в Django Rest Framework

Я пытаюсь использовать пагинацию курсора (потому что count(*) занимает слишком много времени), но у меня уже есть код, который реализует пользовательское упорядочивание.

#view.py

class BookViewSet(ModelViewSet):
    serializer_class = BookSerializer
    queryset = Book.objects.all()
    pagination_class = BookCursorPagination
    filterset_class = BookFilterSet
    filter_backends = [filters.DjangoFilterBackend]

#pagination.py

class BookCursorPagination(CursorPagination):
    page_size = 10
    ordering = 'id'  # Specify the field by which you want to paginate
    ordering_param = 'ordering'  # The parameter for specifying ordering in the URL

    def get_ordering(self, request, queryset, view):
        """
        Return the field or fields to use for ordering the queryset.
        """
        ordering = request.query_params.get(self.ordering_param)
        if ordering:
            return ordering.split(',')
        return self.ordering.split(',')

#filters.py

from django.db.models import F, QuerySet, Func
from django_filters import rest_framework as filters
from django_filters.constants import EMPTY_VALUES

from poll.models import Book


class BookCustomOrderingFilter(filters.OrderingFilter):
    def filter(self, qs: QuerySet, value):
        if value in EMPTY_VALUES:
            return qs

        if any(v in ['test_ordering', '-test_ordering'] for v in value):
            qs = qs.annotate(
                author_length=Func(F('author'), function='LENGTH')
            )
            return qs.order_by("author_length", "id")

        return super().filter(qs, value)

class BookFilterSet(filters.FilterSet):

    ordering = BookCustomOrderingFilter(
        fields=(
            ("test_ordering", "test_ordering")
        ),
    )

Как использовать 'test_ordering' вместе с пагинацией курсора?

Вернуться на верх