rest_framework--过滤器filters--排序
程序员文章站
2022-05-23 08:35:35
...
rest_framework–过滤器filters–排序
-
view
from rest_framework.pagination import PageNumberPagination from rest_framework import mixins from rest_framework import viewsets from rest_framework import filters from .models import Goods from .serializers import GoodsSerializer class GoodsPagination(PageNumberPagination): page_size = 10 page_size_query_param = "page_size" page_query_param = "p" max_page_size = 100 class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): # 指定queryset queryset = Goods.objects.all() # 指定序列化类 serializer_class = GoodsSerializer # 指定分页类 pagination_class = GoodsPagination # 添加过滤器 这里可以吧django-filter过滤器添加进来 和 rest_framework的filters添加进来一起用, 也可以单个用, 看你的需求 filter_backends = [filters.OrderingFilter] # 指定排序的字段 ordering_fields = ["sold_num", "add_time"]
-
settings
INSTALLED_APPS = [ 'rest_framework', ]
-
url
from django.conf.urls import url, include from rest_framework.routers import DefaultRouter from goods.views import GoodsListViewSet # 生成一个注册器实例对象 router = DefaultRouter() # 将需要自动生成url的接口注册 # 配置goods的url router.register(r'goods', GoodsListViewSet, base_name="goods-list") urlpatterns = [ # 自动生成url url(r"^", include(router.urls)), ]
-
效果图
-
官方说明
OrderingFilter
本
OrderingFilter
类支持控制结果的排序简单的查询参数。默认情况下,查询参数已命名
'ordering'
,但这可能会被ORDERING_PARAM
设置覆盖。例如,要按用户名订购用户:
http://example.com/api/users?ordering=username
客户端还可以通过在字段名称前加上“ - ”来指定反向排序,如下所示:
http://example.com/api/users?ordering=-username
还可以指定多个排序:
http://example.com/api/users?ordering=account,username
指定可以针对哪些字段进行排序
建议您明确指定API在排序过滤器中应允许的字段。您可以通过
ordering_fields
在视图上设置属性来执行此操作,如下所示:class UserListView(generics.ListAPIView): queryset = User.objects.all() serializer_class = UserSerializer filter_backends = [filters.OrderingFilter] ordering_fields = ['username', 'email']
这有助于防止意外数据泄漏,例如允许用户针对密码哈希字段或其他敏感数据进行排序。
如果未
ordering_fields
在视图上指定属性,则筛选器类将默认允许用户筛选serializer_class
属性指定的序列化程序上的任何可读字段。如果您确信视图使用的查询集不包含任何敏感数据,则还可以使用特殊值明确指定视图应允许对任何模型字段或查询集合进行排序
'__all__'
。class BookingsListView(generics.ListAPIView): queryset = Booking.objects.all() serializer_class = BookingSerializer filter_backends = [filters.OrderingFilter] ordering_fields = '__all__'
指定默认排序
如果
ordering
在视图上设置了属性,则将其用作默认排序。通常,您可以通过设置
order_by
初始查询集来控制它,但是使用ordering
视图上的参数允许您以一种方式指定排序,然后它可以作为上下文自动传递给渲染模板。这样,如果用于排序结果,则可以自动呈现列标题。class UserListView(generics.ListAPIView): queryset = User.objects.all() serializer_class = UserSerializer filter_backends = [filters.OrderingFilter] ordering_fields = ['username', 'email'] ordering = ['username']
该
ordering
属性可以是字符串或字符串的列表/元组。
上一篇: HBase基础知识笔记(含安装配置与开发环境避坑流程)
下一篇: 使用过滤器递归打印多级目录