zoukankan      html  css  js  c++  java
  • 路飞项目搭建5 课程模块: 表设计,表关系优化,群查接口模块(分页组件,搜索组件,排序组件), 快捷创建app,Navicat导入命令位置

    快捷创建app

    进入对应apps
    (luffy) D:oldboy_edupython_codeday74_luffyluffyapi>cd luffyapiapps
    
    
    在该路径下输入      python ../../manage.py startapp course
    可以直接在apps下创建course app

    Navicat导入命令

    课程

    准备工作

    """
    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', )
    views.py
    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
    urls.py
    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',
            # )
    views.py
    class CourseViewSet(GenericViewSet, ListModelMixin):
        queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
        serializer_class = serializers.CourseSerializer
    urls.py
    router.register('free', views.CourseViewSet, 'free')

    分页组件

    """ 分页组件的使用
    1)重写分页类 - 自定义同名类继承drf的分页类
    2)完成必要的配置
    3)将重写的分页类配置给群查需求的视图类
    """
    pagination.py
    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
    """
    filters.py
    # 前台接口:/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)过滤:搜索过滤、排序过滤、自定义过滤
    """
  • 相关阅读:
    CAST和CONVERT
    #pragma 预处理指令详解
    Android系统移植主要事项
    Java动态绑定机制的内幕
    Java接口和抽象类用法总结
    Android工程的编译过程
    点击按钮,并且实现增加一个按钮的效果 (附效果图)
    iOS-设置导航栏"返回"按钮 (附效果图)
    常用代码整理(重要)
    NSTimer 的暂停与恢复运行。
  • 原文地址:https://www.cnblogs.com/ludingchao/p/12424918.html
Copyright © 2011-2022 走看看