篇首语:本文由编程笔记#小编为大家整理,主要介绍了DRF的分页组件,过滤组件相关的知识,希望对你有一定的参考价值。
目录
1. 新建一个pagination.py文件,自定义分页类
# pagination.py文件中:
from rest_framework import pagination
# 自定义基础分页类
class PageNumberPagination(pagination.PageNumberPagination):
# 默认一页显示的条数
page_size = 2
# 查询页面的关键字,就是在url中参数的key
page_query_param = 'page'
# 用户自定义一页显示条数的关键字,就是在url中参数的key
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
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
3. 访问接口的url形式
(1)基础分页的url格式,不加拼接参数,则默认不分页
127.0.0.1:8000/courses/?page=数字&page_size=数字
(2)偏移分页的url格式,不加拼接参数,则默认不分页
127.0.0.1:8000/courses/?limit=数字&offset=数字
1. 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两个字段
2. 访问接口的url形式
127.0.0.1:8000/courses/?search=关键字 # 该关键字会匹配 search_fields 中配置的所有字段所对应的数据
1. 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 按价格降序,价格相同时按主键升序
2. 访问接口的url的格式
127.0.0.1:8000/courses/?ordering=配置的排序字段 # 排序字段可加负号,表示降序
1. 新建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 # 没过滤
2. 在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]
3. 访问接口的url格式:
127.0.0.1:8000/courses/?count=数字
1. 安装插件
pip install django-filter
2. 新建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']
3. 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的所有课程
4. 访问接口url格式
127.0.0.1:8000/courses/?course_category=数据库中对应的某个值 # 分类
127.0.0.1:8000/courses/?min_price=数字&max_price=数字 # 区间
{{course_info.students}}人在学 课程总时长:{{course_info.sections}}课时/{{course_info.pub_sections}}小时 难度:{{course_info.level_name}} 价格 ¥{{course_info.price}} 课程章节 共{{course_chapters.length}}章 {{course_info.sections}}个课时 第{{chapter.chapter}}章·{{chapter.name}} {{chapter.chapter}}-{{section.orders}} {{section.duration}} {{course_info.teacher.name}} {{course_info.teacher.signature}} {{course_info.teacher.brief}}1. 在main.js文件中配置播放器组件
// vue-video播放器
require('video.js/dist/video-js.css');
require('vue-video-player/src/custom-theme.css');
import VideoPlayer from 'vue-video-player'
Vue.use(VideoPlayer);
:playsinline="true"
:optiOns="playerOptions"
@play="onPlayerPlay($event)"
@pause="onPlayerPause($event)">
{{course_info.name}}
{{section.name}}免费
用户评论
常见问题
授课老师
{{course_info.teacher.title}}