Класс CusorPagination
просто читает значение из строки запроса и декодирует его для внутреннего использования. Если вы хотите узнать текущую позицию для только что сделанного запроса, вы можете просто сделать то же самое. Так как экземпляр paginator выбрасывается после использования, вы не можете посмотреть на него.
Даже если бы вы могли, вы бы получили «декодированное» значение курсора, которое вам пришлось бы перекодировать, чтобы отправить позже.
# from rest_framework/pagination.py@CursorPagination.paginate_queryset
encoded = request.query_params.get(self.cursor_query_param)
# read it yourself somewhere in your view/viewset
current_value = request.query_params.get('cursor')
Если вы хотите изменить поведение в целом, просто создайте пользовательскую реализацию и верните дополнительное поле. Установите это как pagination_class
в представлении (или в настройках, если оно глобально).
UNTESTED пример кода:
class FancyCursorPagination(CusorPagination):
def get_paginated_response(self, data):
return Response(OrderedDict([
('next', self.get_next_link()),
('previous', self.get_previous_link()),
('current', self.get_current_link()),
('results', data)
]))
def get_current_link(self):
"""
Return a link to the current position.
- self.cursor set in the paginate_queryset() method.
To return only the query parameter in this field, use:
- return request.query_params.get(self.cursor_query_param, None)
"""
if self.cursor:
return self.encode_cursor(self.cursor)
else:
# cursor will be None on the first call
return None
def get_paginated_response_schema(self, schema):
new_schema = super().get_paginated_response_schema(schema)
new_schema["properties"]["current"] = {
"type": "string",
"nullable": True
}
return new_schema
class MyApiView(APIView):
pagination_class = FancyCursorPagination