分页过滤组件

Posted zhm-cyt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分页过滤组件相关的知识,希望对你有一定的参考价值。

复习

"""
1、celery框架
    定义:异步任务框架 - 独立运行的服务器,由三部分组成
        内部有socekt,可以起worker(执行任务)及beat(提交任务)两种socket
        三部分包含:存储任务的broker + 执行任务的worker + 存储结果的backend
        app_worker = Celery(broker, backend, include)
    
    作用:
        任务:@app.task装饰的函数
        异步任务:任务.delay() => 处理耗时的需求
        延迟任务:任务.apply_async(args,kwargs,eta) => 处理延迟的需求
        定时任务:完成任务的beat配置,启动beat服务 => 处理周期性的需求
        
    命令:
        celery worker -A 包|模块 -l info -P eventlet
        celery beat -A 包|模块 -l info
        
2、课程应用
    课程业务分析,表构建
        -- 免费课,实战课,轻课业务线独立(可以分表处理)
        -- 课程表家族:课程表,分类表,老师表,章节表,课时表
        -- 分类群查接口,课程群查接口
"""

分页组件

自定义分页类完成配置:paginations.py
from rest_framework import pagination

# 基础分页
class PageNumberPagination(pagination.PageNumberPagination):
    # 默认一页显示的条数
    page_size = 2
    # 查询页面的关键字
    page_query_param = 'page'
    # 用户自定义一页显示条数的关键字
    page_size_query_param = 'page_size'
    # 用户最大可自定义一页显示的条数
    max_page_size = 2

class LimitOffsetPagination(pagination.LimitOffsetPagination):
    # 默认一页显示的条数
    default_limit = 2
    # 用户自定义一页显示的条数
    limit_query_param = 'limit'
    # 用户自定义偏移的条数
    offset_query_param = 'offset'
    # 用户最大可自定义一页显示的条数
    max_limit = 2
群查接口的视图类:views.py
from . import paginations
class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
    queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
    serializer_class = serializers.CourseModelSerializer
    
    # 配置某一个分页类即可
    pagination_class = paginations.PageNumberPagination
    # 注:接口分页前后,response的格式不一样
    #       分页前:数据是response.data
    #       分页后:数据是response.data.results

过滤

搜索

群查接口的视图类:views.py
from rest_framework.filters import SearchFilter
class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
    queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
    serializer_class = serializers.CourseModelSerializer
    
    # 配置搜索组件
    filter_backends = [SearchFilter]
    # 配置参与搜索字段
    search_fields = ['name', 'brief']
    # 规则:
    #   参与全文搜索的字段为name和brief(两个字段必须都是数据库表字段)
    #   接口:?search=搜索关键字,会全文匹配name和brief两个字段

搜索

群查接口的视图类:views.py
from rest_framework.filters import OrderingFilter
class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
    queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
    serializer_class = serializers.CourseModelSerializer
    
    # 配置排序组件
    filter_backends = [OrderingFilter]
    # 配置参与排序字段
    ordering_fields = ['price', 'id', 'students']
    # 规则:
    #       ?ordering=price 按价格升序
    #       ?ordering=-price 按价格降序
    #       ?ordering=id 按主键升序
    #       ?ordering=-price,id 按价格降序,价格相同时按主键升序

自定义

自定义过滤类:filters.py
# 自定义过滤器:自定义普通类,实现filter_queryset可以接受request, queryset, view返回过滤处理后的queryset即可
class MyFilter:
    def filter_queryset(self, request, queryset, view):
        # 过滤条件是死的,?count=数字,也可以写高级一点,从view中去反射配置信息,或者将配置信息放在settings中
        count = request.query_params.get('count', None)
        if not count:
            return queryset  # 没过滤
        try:
            count = int(count)
            return queryset[:count]  # 过滤
        except:
            return queryset  # 没过滤
群查接口的视图类:views.py
from .filters import MyFilter
class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
    queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
    serializer_class = serializers.CourseModelSerializer
    
    # 配置排序组件
    filter_backends = [MyFilter]
    

分类与区间

安装django-filter插件
>: pip install django-filter
自定义过滤规则类:filters.py
from django_filters import filters
from . import models
class CourseFilterSet(FilterSet):
    # 实现区间:field_name关联model表属性,lookup_expr设置过滤规则
    min_price = filters.NumberFilter(field_name='price', lookup_expr='gte')
    max_price = filters.NumberFilter(field_name='price', lookup_expr='lte')
    class Meta:
        model = models.Course
        # min_price 和 max_price 自定义规则字段可以不在fields中配置
        fields = ['course_category']
群查接口的视图类:views.py
from django_filters.rest_framework import DjangoFilterBackend
from .filters import CourseFilterSet
class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
    queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
    serializer_class = serializers.CourseModelSerializer
    
    # 配置过滤组件
    filter_backends = [DjangoFilterBackend]
    # 配置过滤规则的类
    filter_class = CourseFilterSet
    # 规则:
    #       ?course_category=1 课程分组1所有的课程
    #       ?min_price=10 课程价格大于等于10的所有课程
    #       ?min_price=10&max_price=100 课程价格大于等于10小于等于100的所有课程

A作业(必做)

"""
1、整理今天所学知识点

2、复习并掌握过滤组件:排序、搜索、分类筛选、区间筛选、分页
    完成课程群查接口:带排序、分页功能
    完成课程搜索接口:带搜索,分页功能
    完成课程单查接口
    完成课程章节群查接口:带分类

3、分析并看懂前台页面
    课程群查页面
    搜索页面
    课程详情页面

4、了解并完成七牛云视频托管
"""

B作业(选做)

"""
1、预习支付功能
    支付流程
    支付应用申请
    支付接口
    支付回调
2、项目上线
    服务器购买
    服务器环境
    前台项目上线
    后台项目上线
"""

以上是关于分页过滤组件的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core 排序过滤分页组件:sieve

drf-过滤组件

分页过滤组件

DJANGO 自定义分页组件

drf 其他功能组件 - 限流-过滤-排序-分页-异常处理-生成接口文档-Xadmin

如何使用角度6的分页,过滤,排序功能在表组件中加载大数据