django_filter,Search_Filter,Order_Filter,分页
一.分页drf配置信息:
1.在Lib\site-packages\rest_framework\settings.py中查看:

2.简单分页在项目setting中配置:(所有get请求返回数据每页5条)
#每页五条数据
REST_FRAMEWORK={
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE':5
}
二.定制分页:
from rest_framework.pagination import PageNumberPagination
#深度定制分页
class GoodsPagination(PageNumberPagination):
page_size = 12
page_size_query_param = 'page_size'
#名称
page_query_param = 'page'
#单页数量最多
max_page_size = 100 class GoodsListViewSet(CacheResponseMixin,mixins.ListModelMixin,mixins.RetrieveModelMixin,viewsets.GenericViewSet):
"""
商品详情页,分页,搜索,过滤,排序
"""
#配置ip限制访问次数
throttle_classes = (UserRateThrottle,AnonRateThrottle)
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
#分页,调用分页定制类
pagination_class = GoodsPagination
三.过滤:
直接通过get_queryset简单过滤:
lass GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
"""
商品详情页
"""
serializer_class = GoodsSerializer
#分页
pagination_class = GoodsPagination
def get_queryset(self):
#接受前端传递的数据
queryset = Goods.objects.all()
min_price = self.request.query_params.get('price_min',0)
if min_price:
queryset=queryset.filter(shop_price__gt=int(min_price))
return queryset
通过filter进行过滤:
安装:pip install django-filter
注册app:把django-filters注册到setting中的install-app中

在view中导入from django_filters.rest_framework import DjangoFilterBackend,并在viewset中写入filter_backends=(DjangoFilterBackend,)
from django_filters.rest_framework import DjangoFilterBackend class GoodsListViewSet(CacheResponseMixin,mixins.ListModelMixin,mixins.RetrieveModelMixin,viewsets.GenericViewSet):
"""
商品详情页,分页,搜索,过滤,排序
"""
#配置ip限制访问次数
throttle_classes = (UserRateThrottle,AnonRateThrottle)
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
#分页
pagination_class = GoodsPagination
#配置认证类,防止公开网页(未登录可查看)不能访问
# authentication_classes = (TokenAuthentication,)
filter_backends=(DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter)
#字段过滤(DjangoFilterBackend)
# filter_fields = ('name', 'shop_price')
#定制的filter
filter_class=GoodsFilter
#搜索过滤(rest_framework.filters.SearchFilter)
search_fields = ('name','goods_brief','goods_desc')
#排序过滤(rest_frameworkfilters.OrderingFilter)
ordering_fields = ('sold_num', 'shop_price') def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
instance.click_num+=1
instance.save()
serializer = self.get_serializer(instance)
return Response(serializer.data)
定制的筛选器:
import django_filters
from django.db.models import Q from .models import Goods class GoodsFilter(django_filters.rest_framework.FilterSet):
#help_text--docs:description
pricemin=django_filters.NumberFilter(field_name='shop_price',lookup_expr='gte',help_text='最低价格')
pricemax=django_filters.NumberFilter(field_name='shop_price',lookup_expr='lte')
# name=django_filters.CharFilter(field_name='name',lookup_expr='icontains')
top_category=django_filters.NumberFilter(method='top_category_filter')
#定制的过滤方法
def top_category_filter(self,queryset,name,value):
return queryset.filter(Q(category_id=value)|Q(category__parent_category_id=value)|Q(category__parent_category__parent_category_id=value)) class Meta:
model=Goods
fields=['pricemin','pricemax','top_category','is_hot','is_new']
四.搜索和排序:
搜索:


from rest_framework import filters class GoodsListViewSet(CacheResponseMixin,mixins.ListModelMixin,mixins.RetrieveModelMixin,viewsets.GenericViewSet):
"""
商品详情页,分页,搜索,过滤,排序
"""
#配置ip限制访问次数
throttle_classes = (UserRateThrottle,AnonRateThrottle)
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
#分页
pagination_class = GoodsPagination
#配置认证类,防止公开网页(未登录可查看)不能访问
# authentication_classes = (TokenAuthentication,)
filter_backends=(DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter)
#字段过滤(DjangoFilterBackend)
# filter_fields = ('name', 'shop_price')
filter_class=GoodsFilter
#搜索过滤(rest_framework.filters.SearchFilter)
search_fields = ('name','goods_brief','goods_desc')
#排序过滤(rest_frameworkfilters.OrderingFilter)
ordering_fields = ('sold_num', 'shop_price') def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
instance.click_num+=1
instance.save()
serializer = self.get_serializer(instance)
return Response(serializer.data)
排序:
指定可以针对哪些字段进行排序
建议您明确指定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属性可以是字符串或字符串的列表/元组。
from rest_framework import filters class GoodsListViewSet(CacheResponseMixin,mixins.ListModelMixin,mixins.RetrieveModelMixin,viewsets.GenericViewSet):
"""
商品详情页,分页,搜索,过滤,排序
"""
#配置ip限制访问次数
throttle_classes = (UserRateThrottle,AnonRateThrottle)
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
#分页
pagination_class = GoodsPagination
#配置认证类,防止公开网页(未登录可查看)不能访问
# authentication_classes = (TokenAuthentication,)
filter_backends=(DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter)
#字段过滤(DjangoFilterBackend)
# filter_fields = ('name', 'shop_price')
filter_class=GoodsFilter
#搜索过滤(rest_framework.filters.SearchFilter)
search_fields = ('name','goods_brief','goods_desc')
#排序过滤(rest_frameworkfilters.OrderingFilter)
ordering_fields = ('sold_num', 'shop_price') def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
instance.click_num+=1
instance.save()
serializer = self.get_serializer(instance)
return Response(serializer.data)
django_filter,Search_Filter,Order_Filter,分页的更多相关文章
- Django REST framework+Vue 打造生鲜超市(一)
一.项目介绍 1.1.掌握的技术 Vue + Django Rest Framework 前后端分离技术 彻底玩转restful api 开发流程 Django Rest Framework 的功能实 ...
- 1- vue django restful framework 打造生鲜超市
Vue+Django REST framework实战 使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支 ...
- 记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能接受的,也是让现场用SQLServerP ...
- js实现前端分页页码管理
用JS实现前端分页页码管理,可以很美观的区分页码显示(这也是参考大多数网站的分页页码展示),能够有很好的用户体验,这也是有业务需要就写了一下,还是新手,经验不足,欢迎指出批评! 首先先看效果图: 这是 ...
- JdbcTemplate+PageImpl实现多表分页查询
一.基础实体 @MappedSuperclass public abstract class AbsIdEntity implements Serializable { private static ...
- MVC如何使用开源分页插件shenniu.pager.js
最近比较忙,前期忙公司手机端接口项目,各种开发+调试+发布现在几乎上线无问题了:虽然公司项目忙不过在期间抽空做了两件个人觉得有意义的事情,一者使用aspnetcore开发了个人线上项目(要说线上其实只 ...
- NET Core-TagHelper实现分页标签
这里将要和大家分享的是学习总结使用TagHelper实现分页标签,之前分享过一篇使用HtmlHelper扩展了一个分页写法地址可以点击这里http://www.cnblogs.com/wangrudo ...
- 套用JQuery EasyUI列表显示数据、分页、查询
声明,本博客从csdn搬到cnblogs博客园了,以前的csdn不再更新,朋友们可以到这儿来找我的文章,更多的文章会发表,谢谢关注! 有时候闲的无聊,看到extjs那么肥大,真想把自己的项目改了,最近 ...
- php实现的分页类
php分页类文件: <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 pr ...
随机推荐
- jvm的解释执行与编译执行
1.原理 字节码无法直接交给硬件执行需要虚拟机翻译成机器码才能执行,“翻译”的策略有两种:解释执行和编译执行又称即使编译(JIT).解释执行是没执行一句字节码的时候把字节码翻译成机器码并执行,优点是启 ...
- leetCode练习1
代码主要采用C#书写 题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你 ...
- 爬取伯乐在线文章(二)通过xpath提取源文件中需要的内容
爬取说明 以单个页面为例,如:http://blog.jobbole.com/110287/ 我们可以提取标题.日期.多少个评论.正文内容等 Xpath介绍 1. xpath简介 (1) xpath使 ...
- 【ES6】export和important使用区别
export命令 export { name1, name2, …, nameN }; export { variable1 as name1, variable2 as name2, …, name ...
- 1043. 输出PATest(20)
1043. 输出PATest(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一个长度不超过10000 ...
- with as 加上 materialize hint 生成实质临时表
WITH AS: 就是将一个子查询部分独立出来,有时候是为了提高SQL语句的可读性,有时候是为了提高SQL语句性能. 如果一个SQL语句中,某个表会被访问多次,而且每次访问的限制条件一样的话,就可以使 ...
- WPF Binding学习(三)
转自;http://blog.csdn.net/lisenyang/article/details/18312199 1.控件与控件间的双向绑定 WPF还支持控件作为数据源, <TextBox ...
- linux配置PS1
自己常用的格式: vi ~/.bashrc export PS1="\[\e[31;1m\]\u@\[\e[34;1m\]\h \[\e[36;1m\]\W $\[\e[37;1m\] &q ...
- Postman的Tests标签测试
接口测试最重要的就是返回数据的检查,一个简单的接口,我们可以肉眼检查返回数据,但接口一旦多起来且复杂,每次的检查都会很费劲,此时我们就需要postman 的tests模块来代替 postman面板: ...
- Linux、Windows如何进行性能监控与调优
1.Linux命令行工具 推荐:CentOS 7 1.1 top命令 top命令的输出如下: top命令的输出可以分为两部分:前半部分是系统统计信息,后半部分是进程信息.在统计信息中, 第1行是任务队 ...