django rest framework queryset не упорядочивает

Я использую модель с Meta ordering = ['-published_date']

Теперь в поле зрения:

class InvoiceViewSet(viewsets.ModelViewSet):
    queryset = Invoice.objects.all()
    serializer_class = InvoiceSerializer
    filter_fields = ('table',)

И сериализатор:

class InvoiceSerializer(serializers.ModelSerializer):
    items = ItemSerializer(many=True, allow_add_remove=True)

    class Meta:
        model = Invoice
        fields = ('id',  'items', 'table', 'published_date')

Но этот порядок не работает, он показывает мне заказ ASC, и мне нужен DESC, он вообще не влияет на порядок.

Что я делаю не так?

Ответ 1

Решение состоит в том, чтобы переопределить filter_queryset:

def filter_queryset(self, queryset):
    queryset = super(InvoiceViewSet, self).filter_queryset(queryset)
    return queryset.order_by('-published_date')

Ответ 2

Если ваша модель действительно имеет заказ, она по-настоящему будет отображаться в представлении списка по умолчанию. Я бы предложил переопределить get_queryset() и отладить возвращаемый результат там или явно добавить порядок в get_queryset().

Например:

queryset = Invoice.objects.all().order_by('-published_date')

Удивительно, если это возможно, вы настроили фильтр, который переопределяет порядок. Стоит проверить, что произойдет, если вы отключите все фильтры. Я вижу, что у вас есть атрибут filter_fields, поэтому, предполагая, что у вас есть что-то подобное в ваших настройках...

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',)
}

Если вы прокомментируете это, это исправить?

Ответ 3

Ответ @Mirza Delic работает, но не сохраняет порядок, исходящий из request.QUERY_PARAMS.

class YOUR_VIEW_SET(viewsets.ModelViewSet):
    #your code here
    ordering_filter = OrderingFilter()

    def filter_queryset(self, queryset):
        queryset = super(YOUR_VIEW_SET, self).filter_queryset(queryset)
        return self.ordering_filter.filter_queryset(self.request, queryset, self)

Это работает для меня и для других людей, я надеюсь.

Ответ 4

Для Django REST Framework вы можете использовать OrderingFilter.

from django_filters import DjangoFilterBackend
from rest_framework import viewsets, filters


class InvoiceViewSet(viewsets.ModelViewSet):
    queryset = Invoice.objects.all()
    serializer_class = InvoiceSerializer

    filter_backends = (DjangoFilterBackend, filters.OrderingFilter)

    # Explicitly specify which fields the API may be ordered against
    ordering_fields = ('items', 'table', 'published_date')

    # This will be used as the default ordering
    ordering = ('-published_date')