路飞项目搭建5 课程模块: 表设计,表关系优化,群查接口模块(分页组件,搜索组件,排序组件)
Posted ludingchao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了路飞项目搭建5 课程模块: 表设计,表关系优化,群查接口模块(分页组件,搜索组件,排序组件)相关的知识,希望对你有一定的参考价值。
课程
准备工作
""" 1)创建course应用 2)dev中注册 3)建立子urls完成路由分发 4)配置课程业务相关表,并录入测试数据(见课件) 5)完成课程分类与课程两个群查接口 """
课程分类群查接口
serializers.py
from rest_framework import serializers from . import models class CourseCategorySerializer(serializers.ModelSerializer): class Meta: model = models.CourseCategory fields = (‘name‘, )
from rest_framework.viewsets import GenericViewSet from rest_framework.mixins import ListModelMixin from . import models, serializers # 课程分类群查 class CourseCategoryViewSet(GenericViewSet, ListModelMixin): queryset = models.CourseCategory.objects.filter(is_delete=False, is_show=True).all() serializer_class = serializers.CourseCategorySerializer
router.register(‘categories‘, views.CourseCategoryViewSet, ‘categories‘)
课程群查接口
serializers.py
# 子序列化 class TeacherSerializer(serializers.ModelSerializer): class Meta: model = models.Teacher fields = (‘name‘, ‘role_name‘, ‘title‘, ‘signature‘, ‘image‘, ‘brief‘) class CourseSerializer(serializers.ModelSerializer): # teacher = TeacherSerializer(many=False) class Meta: model = models.Course fields = (‘id‘, ‘name‘, ‘price‘) # fields = ( # ‘id‘, # ‘name‘, # ‘course_img‘, # ‘brief‘, # ‘attachment_path‘, # ‘pub_sections‘, # ‘price‘, # ‘students‘, # ‘period‘, # ‘sections‘, # ‘course_type_name‘, # ‘level_name‘, # ‘status_name‘, # ‘teacher‘, # ‘section_list‘, # )
class CourseViewSet(GenericViewSet, ListModelMixin): queryset = models.Course.objects.filter(is_delete=False, is_show=True).all() serializer_class = serializers.CourseSerializer
router.register(‘free‘, views.CourseViewSet, ‘free‘)
""" 分页组件的使用 1)重写分页类 - 自定义同名类继承drf的分页类 2)完成必要的配置 3)将重写的分页类配置给群查需求的视图类 """
from rest_framework.pagination import PageNumberPagination as DrfPageNumberPagination class PageNumberPagination(DrfPageNumberPagination): # 默认一页显示的条数 page_size = 2 # url中携带页码的key page_query_param = ‘page‘ # url中用户携带自定义一页条数的key page_size_query_param = ‘page_size‘ # 用户最大可自定义一页的条数 max_page_size = 3 from rest_framework.pagination import LimitOffsetPagination as DrfLimitOffsetPagination class LimitOffsetPagination(DrfLimitOffsetPagination): # 默认一页显示的条数 default_limit = 2 # url中用户携带自定义一页条数的key limit_query_param = ‘limit‘ # url中用户携带自定义偏移条数的key offset_query_param = ‘offset‘ # 用户最大可自定义一页的条数 max_limit = 2 from rest_framework.pagination import CursorPagination as DrfCursorPagination class CursorPagination(DrfCursorPagination): # 默认一页显示的条数 page_size = 2 # url中携带页码的key(编码后的结果) cursor_query_param = ‘cursor‘ # url中用户携带自定义一页条数的key page_size_query_param = ‘page_size‘ # 用户最大可自定义一页的条数 max_page_size = 3 # 游标分页器的特殊点: # 1)如果视图类没有配 排序过滤组件filter_backends = [OrderingFilter],采用 ordering 设置的作为默认排序规则 # 2)如果视图类配了 排序过滤组件filter_backends = [OrderingFilter],url请求必须带上ordering排序规则,因为默认排序规则失效 # 注:因为游标分页是基于排序后结果上的分页 ordering = ‘-price‘
""" 搜索组件 1)在视图文件views.py中导入drf的搜索组件 from rest_framework.filters import SearchFilter 2)将搜索组件配置给群查接口视图类的filter_backends filter_backends = [SearchFilter] 3)配置视图类关联的Model表参与搜索的字段 search_fields = [‘name‘, ‘id‘] 4)前台访问该群查接口,采用拼接参数方式用search关键字将搜索目标提供给后台 http://127.0.0.1:8000/course/free/?search=2 # id或name中包含2的所有结果 """
""" 排序组件 1)在视图文件views.py中导入drf的搜索组件 from rest_framework.filters import OrderingFilter 2)将搜索组件配置给群查接口视图类的filter_backends filter_backends = [OrderingFilter] 3)配置视图类关联的Model表允许排序的字段 ordering_fields = [‘id‘, ‘price‘] 4)前台访问该群查接口,采用拼接参数方式用ordering关键字将搜索目标提供给后台 http://127.0.0.1:8000/course/free/?ordering=price,-id # 按price升序,如果price相同,再按id降序 """
""" 自定义过滤器 1)自定义类实现filter_queryset方法即可,接收request, queryset, view参数 2)制定过滤条件,将过滤成功后的queryset返回即可,如果过滤失败,返回原样的queryset 3)将自定义过滤类配置给群查视图类的filter_backends """
# 前台接口:/course/free/?count=2 ,代表只对前台返回2条数据 class CountFilter: def filter_queryset(self, request, queryset, view): count = request.query_params.get(‘count‘, None) try: # TODO: 切片后的queryset不能再做ORM Q查询,如何实现queryset切片,现在再过滤时后配置 # 结论:drf的搜索组件和排序组件都是建立在表的所有数据基础上的过滤规则,所以该自定义过滤类在视图类配置中 # filter_backends = [SearchFilter, OrderingFilter, CountFilter] 必须在前两者之后 return queryset[:int(count)] except: return queryset
views.py
# 分页组件:基础分页(采用)、偏移分页、游标分页(了解) from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination from . import pagination # 过滤组件:搜索功能、排序功能 from rest_framework.filters import SearchFilter, OrderingFilter from .filters import CountFilter class CourseViewSet(GenericViewSet, ListModelMixin): queryset = models.Course.objects.filter(is_delete=False, is_show=True).all() serializer_class = serializers.CourseSerializer # 分页组件 # 方法一:直接使用drf分页类,在视图类中完成分页类的必要配置 # pagination_class = PageNumberPagination # PageNumberPagination.page_size = 1 # 方法二:自定义分页类继承drf分页类,在自定义分页类中完成配置,视图类中使用自定义分页类 # 基础分页器 # pagination_class = pagination.PageNumberPagination # 偏移分页器,没有固定页码,自定义从偏移量开始往后查询自定义条数 # pagination_class = pagination.LimitOffsetPagination # 游标分页器 # pagination_class = pagination.CursorPagination # 过滤组件:实际开发,有多个过滤条件时,要把优先级高的放在前面 filter_backends = [SearchFilter, OrderingFilter, CountFilter] # 参与搜索的字段 search_fields = [‘name‘, ‘id‘] # 允许排序的字段 ordering_fields = [‘id‘, ‘price‘]
""" 1)分析课程业务 三条独立的课程线:免费课、实战课、学位课 重点:一些连表计算的结果,可以直接用一个字段表示(能不连表尽量不连表) 2)课程相关表设计(CV) 3)课程分类群查接口(简单) 4)课程群查接口: i)参与序列化的字段:display、子序列化、连表序列化 ii)分页器:基础、偏移、游标分页器(了解) iii)过滤:搜索过滤、排序过滤、自定义过滤 """
以上是关于路飞项目搭建5 课程模块: 表设计,表关系优化,群查接口模块(分页组件,搜索组件,排序组件)的主要内容,如果未能解决你的问题,请参考以下文章
路飞项目,文件存储,搜索导航栏,搜索接口,搜索页面,支付宝字符介绍,支付宝二次封装,订单表设计,下单接口,前端支付页面,支付成功回调接口