@@ -312,6 +312,7 @@ class OrderingFilterModel(models.Model):
312
312
313
313
class OrderingFilterRelatedModel (models .Model ):
314
314
related_object = models .ForeignKey (OrderingFilterModel , related_name = "relateds" , on_delete = models .CASCADE )
315
+ index = models .SmallIntegerField (help_text = "A non-related field to test with" , default = 0 )
315
316
316
317
317
318
class OrderingFilterSerializer (serializers .ModelSerializer ):
@@ -320,6 +321,19 @@ class Meta:
320
321
fields = '__all__'
321
322
322
323
324
+ class OrderingDottedRelatedSerializer (serializers .ModelSerializer ):
325
+ related_text = serializers .CharField (source = 'related_object.text' )
326
+ related_title = serializers .CharField (source = 'related_object.title' )
327
+
328
+ class Meta :
329
+ model = OrderingFilterRelatedModel
330
+ fields = (
331
+ 'related_text' ,
332
+ 'related_title' ,
333
+ 'index' ,
334
+ )
335
+
336
+
323
337
class DjangoFilterOrderingModel (models .Model ):
324
338
date = models .DateField ()
325
339
text = models .CharField (max_length = 10 )
@@ -484,6 +498,36 @@ class OrderingListView(generics.ListAPIView):
484
498
{'id' : 2 , 'title' : 'yxw' , 'text' : 'bcd' },
485
499
]
486
500
501
+ def test_ordering_by_dotted_source (self ):
502
+
503
+ for index , obj in enumerate (OrderingFilterModel .objects .all ()):
504
+ OrderingFilterRelatedModel .objects .create (
505
+ related_object = obj ,
506
+ index = index
507
+ )
508
+
509
+ class OrderingListView (generics .ListAPIView ):
510
+ serializer_class = OrderingDottedRelatedSerializer
511
+ filter_backends = (filters .OrderingFilter ,)
512
+ queryset = OrderingFilterRelatedModel .objects .all ()
513
+
514
+ view = OrderingListView .as_view ()
515
+ request = factory .get ('/' , {'ordering' : 'related_object__text' })
516
+ response = view (request )
517
+ assert response .data == [
518
+ {'related_title' : 'zyx' , 'related_text' : 'abc' , 'index' : 0 },
519
+ {'related_title' : 'yxw' , 'related_text' : 'bcd' , 'index' : 1 },
520
+ {'related_title' : 'xwv' , 'related_text' : 'cde' , 'index' : 2 },
521
+ ]
522
+
523
+ request = factory .get ('/' , {'ordering' : '-index' })
524
+ response = view (request )
525
+ assert response .data == [
526
+ {'related_title' : 'xwv' , 'related_text' : 'cde' , 'index' : 2 },
527
+ {'related_title' : 'yxw' , 'related_text' : 'bcd' , 'index' : 1 },
528
+ {'related_title' : 'zyx' , 'related_text' : 'abc' , 'index' : 0 },
529
+ ]
530
+
487
531
def test_ordering_with_nonstandard_ordering_param (self ):
488
532
with override_settings (REST_FRAMEWORK = {'ORDERING_PARAM' : 'order' }):
489
533
reload_module (filters )
0 commit comments