Ответ 1
Решение состоит в том, чтобы переопределить filter_queryset
:
def filter_queryset(self, queryset):
queryset = super(InvoiceViewSet, self).filter_queryset(queryset)
return queryset.order_by('-published_date')
Я использую модель с 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, он вообще не влияет на порядок.
Что я делаю не так?
Решение состоит в том, чтобы переопределить filter_queryset
:
def filter_queryset(self, queryset):
queryset = super(InvoiceViewSet, self).filter_queryset(queryset)
return queryset.order_by('-published_date')
Если ваша модель действительно имеет заказ, она по-настоящему будет отображаться в представлении списка по умолчанию. Я бы предложил переопределить get_queryset()
и отладить возвращаемый результат там или явно добавить порядок в get_queryset()
.
Например:
queryset = Invoice.objects.all().order_by('-published_date')
Удивительно, если это возможно, вы настроили фильтр, который переопределяет порядок. Стоит проверить, что произойдет, если вы отключите все фильтры. Я вижу, что у вас есть атрибут filter_fields
, поэтому, предполагая, что у вас есть что-то подобное в ваших настройках...
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',)
}
Если вы прокомментируете это, это исправить?
Ответ @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)
Это работает для меня и для других людей, я надеюсь.
Для 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')