gault-millau/apps/utils/filters.py
2019-08-07 16:10:23 +03:00

31 lines
855 B
Python

"""Marketplace filters."""
from django.db.models import F
from django_filters import rest_framework as filters
EMPTY_VALUES = ([], (), {}, '', None)
class NullsAlwaysLastOrderingFilter(filters.OrderingFilter):
""" Use Django 1.11 nulls_last feature to force nulls to bottom in all orderings. """
def filter(self, qs, value):
if value in EMPTY_VALUES:
return qs
ordering = [self.get_ordering_value(param) for param in value]
if ordering:
f_ordering = []
for o in ordering:
if not o:
continue
if o[0] == '-':
f_ordering.append(F(o[1:]).desc(nulls_last=True))
else:
f_ordering.append(F(o).asc(nulls_last=True))
return qs.order_by(*f_ordering)
return qs