This commit is contained in:
Daniel Bate 2017-10-25 08:56:49 +00:00 committed by GitHub
commit 9ddbb7332a
2 changed files with 31 additions and 1 deletions

View File

@ -199,7 +199,7 @@ class OrderingFilter(BaseFilterBackend):
raise ImproperlyConfigured(msg % self.__class__.__name__)
return [
(field.source or field_name, field.label)
(field.source.replace('.', '__') or field_name, field.label)
for field_name, field in serializer_class(context=context).fields.items()
if not getattr(field, 'write_only', False) and not field.source == '*'
]

View File

@ -320,6 +320,18 @@ class OrderingFilterSerializer(serializers.ModelSerializer):
fields = '__all__'
class OrderingDottedRelatedSerializer(serializers.ModelSerializer):
related_text = serializers.CharField(source='related_object.text')
related_title = serializers.CharField(source='related_object.title')
class Meta:
model = OrderingFilterRelatedModel
fields = (
'related_text',
'related_title',
)
class DjangoFilterOrderingModel(models.Model):
date = models.DateField()
text = models.CharField(max_length=10)
@ -484,6 +496,24 @@ class OrderingFilterTests(TestCase):
{'id': 2, 'title': 'yxw', 'text': 'bcd'},
]
def test_ordering_by_dotted_source(self):
for obj in OrderingFilterModel.objects.all():
OrderingFilterRelatedModel.objects.create(related_object=obj)
class OrderingListView(generics.ListAPIView):
serializer_class = OrderingDottedRelatedSerializer
filter_backends = (filters.OrderingFilter,)
queryset = OrderingFilterRelatedModel.objects.all()
view = OrderingListView.as_view()
request = factory.get('/', {'ordering': 'related_object__text'})
response = view(request)
assert response.data == [
{'related_title': 'zyx', 'related_text': 'abc'},
{'related_title': 'yxw', 'related_text': 'bcd'},
{'related_title': 'xwv', 'related_text': 'cde'},
]
def test_ordering_with_nonstandard_ordering_param(self):
with override_settings(REST_FRAMEWORK={'ORDERING_PARAM': 'order'}):
reload_module(filters)