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:

http://127.0.0.1:8000/api/ingredients/?ordering=-name

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

-- 
You received this message because you are subscribed to the Google Groups 
"Django REST framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to