ordering_filters not recognized when i extend OrderingFilter class

18 views
Skip to first unread message

Simha Rupa Das

unread,
Nov 18, 2017, 1:11:54 PM11/18/17
to Django REST framework
I want to have a case-insensitive orderingfilter for name field so i have created a class CaseInsensitiveOrderingFilter which extends OrderingFilter:

```
class CaseInsensitiveOrderingFilter(OrderingFilter):
ordering_fields = ('name')

def filter_queryset(self, request, queryset, view):
ordering = self.get_ordering(request, queryset, view)

if ordering:
new_ordering = []
for field in ordering:
if field.startswith('-'):
new_ordering.append(Lower(field[1:]).desc())
else:
new_ordering.append(Lower(field).asc())
return queryset.order_by(*new_ordering)

return queryset
```

and then use it in the ListApiView

```
class IngredientListAPIView(ListAPIView):
queryset = Ingredient.objects.all()
serializer_class = IngredientListSerializer
filter_backends = [SearchFilter,CaseInsensitiveOrderingFilter]
```
then i try the endpoint:


It does not sort the queryset w.r.t name field.

When i debig I found that: 

```
           fields = [param.strip() for param in params.split(',')]  -- ['name]
           ordering = self.remove_invalid_fields(queryset, fields, view)  ---- []
```
why ordering = []

where as removing ordering_filters inside CaseInsensitiveOrderingFilter, sorts any field with CaseInsensitiveOrderingFilter
```
class CaseInsensitiveOrderingFilter(OrderingFilter):
### ordering_fields = ('name')
print(ordering_fields)

def filter_queryset(self, request, queryset, view):
ordering = self.get_ordering(request, queryset, view)

if ordering:
new_ordering = []
for field in ordering:
if field.startswith('-'):
new_ordering.append(Lower(field[1:]).desc())
else:
new_ordering.append(Lower(field).asc())
return queryset.order_by(*new_ordering)

return queryset
```

HOw to pass the ordering_fields to the extended class of OrderingFilter
Reply all
Reply to author
Forward
0 new messages