一、drf 提供的过滤器(ordering)

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers # OrderingFilter排序
from rest_framework.filters import OrderingFilter, class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()
serializer_class = serializers.FreeCourseModelSerializer # 配置过滤器类
filter_backends = [OrderingFilter,]
# 参与排序的字段: ordering=-price, id
ordering_fields = ['price', 'id']

请求的url为http://127.0.0.1:8000/course/free?ordering=-price,id

二、自定义过滤器

以获取的数据条数为例

filters.py

# 继承BaseFilterBackend
from rest_framework.filters import BaseFilterBackend class LimitFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
# 获取前台想要的数据条数
limit = request.query_params.get('limit')
try:
return queryset[:int(limit)]
except:
return queryset

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers # OrderingFilter排序
from rest_framework.filters import OrderingFilter,
from .filters import LimitFilter class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()
serializer_class = serializers.FreeCourseModelSerializer # 配置过滤器类, 自定义过滤器类可与自带的共用
filter_backends = [OrderingFilter, LimitFilter] # LimitFilter为自定义过滤器
# 参与排序的字段: ordering=-price,id
ordering_fields = ['price']

三、群查搜索过滤器

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers # SearchFilter搜索过滤器
from rest_framework.filters import SearchFilter class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()
serializer_class = serializers.FreeCourseModelSerializer # 配置搜索过滤器类
filter_backends = [SearchFilter]
# 参与搜索的字段: search = python (意思是name字段中带python就可以了)
search_fields = ['name']

请求的url为:http://127.0.0.1:8000/course/free?search=python

四、drf分页器(pagination)

paginations.py

需自定义参数

# 继承分页器类
from rest_framework.pagination import PageNumberPagination class CoursePageNumberPagination(PageNumberPagination):
# 默认一页显示的条数
page_size = 2
# 选择哪一页的key,在url中?page=2,代表第二页
page_query_param = 'page'
# 用户自定义一页条数
page_size_query_param = 'page_size'
# 用户自定义一页最大控制条数
max_page_size = 10

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers from .paginations import CoursePageNumberPagination class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()
serializer_class = serializers.FreeCourseModelSerializer # 分页器
pagination_class = CoursePageNumberPagination

请求的url为http://127.0.0.1:8000/course/free?page=1

五、偏移条数分页器(了解)

paginations.py

from rest_framework.pagination import LimitOffsetPagination

class CourseLimitOffsetPagination(LimitOffsetPagination):
# 默认一页条数
default_limit = 2
# 从offset开始往后显示limit条
limit_query_param = 'limit'
offset_query_param = 'offset'
# 最大一页最大条数
max_limit = 2

views.py

from rest_framework.generics import ListAPIView
from . import models, serializers from .paginations import CourseLimitOffsetPagination class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()
serializer_class = serializers.FreeCourseModelSerializer # 偏移分页器
pagination_class = CourseLimitOffsetPagination

请求的url:http://127.0.0.1:8000/course/free?limit=1&offset=2

六、分类筛选过滤器

1.普通使用筛选

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers # 分类筛选过滤器 pip install django-filter
from django_filters.rest_framework import DjangoFilterBackend class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()
serializer_class = serializers.FreeCourseModelSerializer # 配置过滤器类
filter_backends = [DjangoFilterBackend,]
# 参与分类筛选的字段
filter_fields = ['course_category']

请求的url: http://127.0.0.1:8000/course/free?course_category=1

2.区间筛选(高级使用)

filters.py

基于django-filter插件,完成指定区间筛选(一般都是对应)数字字段

from django_filters.rest_framework.filterset import FilterSet
from django_filters import filters
from . import models
class CourseFilterSet(FilterSet):
# 自定义筛选字段 lte代表 <= 小于等于
max_price = filters.NumberFilter(field_name='price', lookup_expr='lte')
# gte 代表 >= 大于等于
min_price = filters.NumberFilter(field_name='price', lookup_expr='gte')
class Meta:
# 关联要筛选的表
model = models.Course
# 参与筛选的字段 可以是自定义字段,也可以是表中字段
fields = ['course_category', 'max_price', 'min_price']

views.py


from rest_framework.generics import ListAPIView
from . import models, serializers # 自定义筛选器
from .filters import CourseFilterSet class FreeCourseListAPIView(ListAPIView):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()
serializer_class = serializers.FreeCourseModelSerializer
# 自定义筛选类
filter_class = CourseFilterSet

请求的url: http://127.0.0.1:8000/course/free?max_price=100&min_price=30

最新文章

  1. 期权定价公式:BS公式推导——从高数和概率论角度
  2. ZOJ Problem Set - 1402 Magnificent Meatballs
  3. Android_Activity生命周期
  4. IOS 2D游戏开发框架 SpriteKit--&gt;续(postion,锚点,游戏滚动场景)
  5. Maven的pom.xml标签详解
  6. 【读书笔记】iOS-防止通讯协议被轻易破解的方法
  7. nginx高并发优化
  8. flume+hadoop
  9. win7系统安装
  10. c#_delegate_异步调用_BeginInvoke
  11. 快速搭建PHP开发环境(PhpStorm+EasyPHP)
  12. Codeforces 432 D. Prefixes and Suffixes
  13. (中等) UESTC 360 Another LCIS ,线段树+区间更新。
  14. django generic view - ListView
  15. 基于jmeter,jenkins,ANT接口,性能测试框架
  16. TCP/IP卷一:第一章
  17. hibernate中对象的3种状态----瞬时态、持久态、脱管态
  18. IDEA 格式化代码快捷键冲突解决
  19. Tomcat配置Web默认页面
  20. ReactiveX 学习笔记(24)使用 RxCpp + C++ REST SDK 调用 REST API

热门文章

  1. shell 队列实现线程并发控制
  2. C++学习笔记13_操作MySql
  3. SasS 设计原则十二因素
  4. [考试反思]1031csp-s模拟测试96:常态
  5. 11、pytest -- 测试的参数化
  6. mysql General error: 1366 Incorrect string value: &#39;\xF0\x9F\x91\x8D\xF0\x9F...&#39; for column &#39;dianpumiaoshu&#39; at row 1 解决方法
  7. mailx加163邮箱发邮件
  8. pat 1120 Friend Numbers(20 分)
  9. 简单的 smartpointer
  10. js数组之sort()函数