Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ordering Filter using 2 ordering values(django_filters)

Hello every one is there a way to use OrderingFilter like in django order_by with 2 ordering values queryset.ordery_by('value1', value_2')

I have tried

order_by = django_filters.OrderingFilter(
        fields=(
            ('item_name', 'Items),
            ('time_from', 'Time'),
            (('value1', 'value2'), 'Value'),
        )
    )

But received expected string or bytes-like object

like image 474
Beliaf Avatar asked Oct 27 '25 14:10

Beliaf


2 Answers

OrderingFilter supports multiple ordering params if you're willing to include them in the request: my_view?order_by=value1,value2.

If you want the same result with a request that looks like my_view?order_by=values, a way I can think of to achieve that is to override OrderingFilter:

class CustomOrderingFilter(OrderingFilter):
    def filter(self, qs, value):
        if any(v == 'values' for v in value):
            qs.order_by('value1', 'value2')
        return super(CustomOrderingFilter, self).filter(qs, value)
like image 80
Netizen29 Avatar answered Oct 29 '25 07:10

Netizen29


I created OrderingFilterExtened for this purposes https://github.com/soldovskij/OrderingFilterExtened

Example:

class UserFilter(FilterSet):
    order_by = OrderingFilterExtened(
        fields_many=(
            ('full_name', ('first_name', 'last_name'), ('-first_name', '-last_name')),
        ),
        fields=(
            ('email', 'email'),  # model field name, parameter name
            ('last_login', 'last_login'),
            ('date_joined', 'date_joined'),
        ),
    )

class UserListAPIView(UsersPermissionQuerysetMixin, generics.ListAPIView):
    queryset = User.objects.all()
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = UserListSerializer
    pagination_class = LimitOffsetPagination
    filterset_class = UserFilter

Request example: api/v2/users/order_by=full_name or api/v2/users/order_by=-full_name

like image 34
soldovskij Avatar answered Oct 29 '25 06:10

soldovskij



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!