Skip to content

showsyu/OrderingFilterExtened

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 

Repository files navigation

OrderingFilterExtened

Extend OrderingFilter from django_filters.
Allows to use multiple model fields per parameter.

Examples with full control of ordering:

from django_filters import FilterSet, CharFilter, DateFromToRangeFilter
from .filter_ex import OrderingFilterExtened

class UserFilter(FilterSet):
    search = CharFilter(method='filter_by_all_name_fields')
    full_name = CharFilter(method='filter_by_full_name')
    email = CharFilter(method='filter_by_email')
    date_joined = DateFromToRangeFilter()
    last_login = DateFromToRangeFilter()

    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'),
        ),
    )
    
    ...

Examples with auto descening ordering:

from django_filters import FilterSet, CharFilter, DateFromToRangeFilter
from .filter_ex import OrderingFilterExtened

class UserFilter(FilterSet):
    search = CharFilter(method='filter_by_all_name_fields')
    full_name = CharFilter(method='filter_by_full_name')
    email = CharFilter(method='filter_by_email')
    date_joined = DateFromToRangeFilter()
    last_login = DateFromToRangeFilter()

    order_by = OrderingFilterExtened(
        fields_many=(
            # same as ('full_name', ('first_name', 'last_name'), ('-first_name', '-last_name')),
            ('full_name', ('first_name', 'last_name')), 
        ),
        fields=(
            ('email', 'email'),  # model field name, parameter name
            ('last_login', 'last_login'),
            ('date_joined', 'date_joined'),
        ),
    )
    
    ...

Usage:

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

About

Extend OrderingFilter from django_filters.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published