"""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