From fc1d932d7d1ae7833f7c5757da32557464122f86 Mon Sep 17 00:00:00 2001 From: mohamed ali Date: Thu, 8 Oct 2026 13:30:49 +0000 Subject: [PATCH] Fix OrderingFilter labels for annotations with ordering_fields='__all__' The label for an annotated field was built with key.title().split('__'), a list, so the browsable API's ordering menu showed e.g. "['Related', 'Count'] - ascending". Join the parts into a string ("Related Count - ascending"), like the labels of model fields. --- rest_framework/filters.py | 2 +- tests/test_filters.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index 4d5cc4c13a..8c32997bd8 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -298,7 +298,7 @@ def get_valid_fields(self, queryset, view, context=None): (field.name, field.verbose_name) for field in queryset.model._meta.fields ] valid_fields += [ - (key, key.title().split('__')) + (key, ' '.join(key.title().split('__'))) for key in queryset.query.annotations ] else: diff --git a/tests/test_filters.py b/tests/test_filters.py index 80cb0a481e..9b05e37f13 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -977,6 +977,20 @@ class OrderingListView(generics.ListAPIView): self.assertContains(response, 'verbose title') + def test_get_template_context_annotation_label(self): + class OrderingListView(generics.ListAPIView): + ordering_fields = '__all__' + serializer_class = OrderingFilterSerializer + queryset = OrderingFilterModel.objects.all().annotate( + models.Count("related")) + filter_backends = (filters.OrderingFilter,) + + request = factory.get('/', HTTP_ACCEPT='text/html') + view = OrderingListView.as_view() + response = view(request) + + self.assertContains(response, 'Related Count - ascending') + def test_ordering_with_overridden_get_serializer_class(self): class OrderingListView(generics.ListAPIView): queryset = OrderingFilterModel.objects.all()