Добавление фильтра в django OrderingFilter

#django #django-rest-framework #django-filter #django-filters

#django #django-rest-framework #django-фильтр #django-фильтры

Вопрос:

Есть ли способ добавить фильтр в queryset для определенного поля упорядочения, например «создано» в OrderingFilter? Я хочу иметь этот фильтр для упорядочения:

 F('created').desc(nulls_last=True)
  

Вот мой код:

 class ProductFilter(filters.FilterSet):
    ordering = filters.OrderingFilter(fields=['price', 'created'])

    class Meta:
        model = Product
  

Комментарии:

1. В class Meta вы должны иметь fields свойство и передавать все поля, которые вы хотите отфильтровать. Там вы также можете определить дополнительные поля

Ответ №1:

Это сработало для меня:

 class NullsLastOrderingFilter(filters.OrderingFilter):
    def filter(self, qs, value):
        if value in ([], (), {}, '', None):
            return qs

        ordering = [self.get_ordering_value(param) for param in value]

        def filter_object(x):
            return F(x[1:]).desc(
                nulls_last=True
            ) if x[0] == '-' else F(x).asc(
                nulls_last=True
            )

        if ordering:
            ordering = map(filter_object, ordering)
            queryset = qs.order_by(*ordering)

        return queryset


class ProductFilter(filters.FilterSet):
    ordering = NullsLastOrderingFilter(fields=['price', 'created'])

    class Meta:
        model = Product