DRF pagination with ordering

Viewed 255

Have trouble with pagination and ordering at the same time. Problem is that one instance can be returned by view multiple times: for example on page 9 and then on page 11.

View:

from rest_framework import filters, viewsets
from django_filters.rest_framework import DjangoFilterBackend
from django_filters import FilterSet
from django_filters.filters import CharFilter

class TariffFilter(FilterSet):
    concat_code = CharFilter(field_name='concat_code')

    class Meta:
        model = Tariff
        fields = {
            'id': ['in', 'exact'],
            'title': ['exact', 'icontains', 'in'],
            .... }

class TariffPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = 'page_size'

class TariffListViewSet(viewsets.ModelViewSet):
    pagination_class = TariffPagination
    serializer_class = tariff_serializer.TariffSerializer
    filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter,)
    filterset_class = TariffFilter
    ordering_fields = ['id', 'title', ...]
    search_fields = ['title', ...]

    def get_queryset(self):
        concated_code = Concat(...., output_field=CharField())
        queryset = Tariff.not_deleted_objects.annotate(concat_code=concated_code)
        return queryset

Serializer:

class TariffSerializer(serializers.ModelSerializer):
    element = TariffElementSerializer()
    service = ServiceElementSerializer()

    class Meta:
        model = Tariff
        fields = ('pk', 'title', 'code', 'element', 'service', 'concated_code', )

Where is problem? example problem query: http://127.0.0.1:8000/api/?ordering=-title&page=2

0 Answers
Related