Как реализовать пользовательское упорядочивание с пагинацией курсора в 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' вместе с пагинацией курсора?