使用 2 个排序值的排序过滤器 (django_filters)
Ordering Filter using 2 ordering values(django_filters)
大家好,有没有办法像在 django order_by
中一样使用 OrderingFilter
和 2 个排序值 queryset.ordery_by('value1', value_2')
我试过了
order_by = django_filters.OrderingFilter(
fields=(
('item_name', 'Items),
('time_from', 'Time'),
(('value1', 'value2'), 'Value'),
)
)
但是收到了expected string or bytes-like object
OrderingFilter
支持多个排序参数,如果您愿意将它们包含在请求中:my_view?order_by=value1,value2
.
如果你想用看起来像 my_view?order_by=values
的请求获得相同的结果,我能想到的一种方法是覆盖 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)
我为此创建了 OrderingFilterExtened
https://github.com/soldovskij/OrderingFilterExtened
示例:
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
请求示例:
api/v2/users/order_by=full_name
或 api/v2/users/order_by=-full_name
大家好,有没有办法像在 django order_by
中一样使用 OrderingFilter
和 2 个排序值 queryset.ordery_by('value1', value_2')
我试过了
order_by = django_filters.OrderingFilter(
fields=(
('item_name', 'Items),
('time_from', 'Time'),
(('value1', 'value2'), 'Value'),
)
)
但是收到了expected string or bytes-like object
OrderingFilter
支持多个排序参数,如果您愿意将它们包含在请求中:my_view?order_by=value1,value2
.
如果你想用看起来像 my_view?order_by=values
的请求获得相同的结果,我能想到的一种方法是覆盖 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)
我为此创建了 OrderingFilterExtened https://github.com/soldovskij/OrderingFilterExtened
示例:
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
请求示例:
api/v2/users/order_by=full_name
或 api/v2/users/order_by=-full_name