路由:course/urls.py
path("category/", views.CategoryListAPIView.as_view()),
path("", views.CourseListAPIView.as_view()),
视图:course/views.py
from rest_framework.generics import ListAPIView

from . import models, serializers

class CategoryListAPIView(ListAPIView):
    queryset = models.CourseCategory.objects.filter(is_delete=False, is_show=True).order_by('orders')
    serializer_class = serializers.CategoryModelSerializer


from .paginations import CoursePageNumberPagination
from rest_framework.filters import OrderingFilter
# 安装django-filter,注册django_filters
from django_filters.rest_framework import DjangoFilterBackend
class CourseListAPIView(ListAPIView):
    queryset = models.Course.objects.filter(is_delete=False, is_show=True)
    serializer_class = serializers.CourseModelSerializer
    # 分页
    pagination_class = CoursePageNumberPagination
    #
    filter_backends = [OrderingFilter, DjangoFilterBackend]
    ordering_fields = ('id', 'price', 'students')
    filter_fields = ('course_category', )
分页:paginations.py
class CoursePageNumberPagination(PageNumberPagination):
    """课程列表数据的分页器"""
    page_query_param = 'page'
    page_size_query_param = 'page_size'
    page_size = 2
    max_page_size = 10
模型:course/models.py
class Course(BaseModel):
    # ...
    # 连表查询
    @property
    def section_list(self):
        temp_section_list = []

        for chapter in self.coursechapters.all():
            for section in chapter.coursesections.all():
                # 最多需要4条数据
                if len(temp_section_list) >= 4:
                    return temp_section_list
                temp_section_list.append({
                    'free_trail': section.free_trail,
                    'name': section.name
                })
        return temp_section_list
序列化:course/serializers.py
from rest_framework.serializers import ModelSerializer

from . import models

class CategoryModelSerializer(ModelSerializer):
    class Meta:
        model = models.CourseCategory
        fields = ('id', 'name')

class TeacherModelSerializer(ModelSerializer):
    class Meta:
        model = models.Teacher
        fields = ('name', 'role', 'title', 'signature', 'image', 'brief')

class CourseModelSerializer(ModelSerializer):
    teacher = TeacherModelSerializer()
    class Meta:
        model = models.Course
        fields = (
            'id',
            'name',
            'course_img',
            'brief',
            'period',
            'attachment_path',
            'students',
            'sections',
            'pub_sections',
            'price',
            'teacher',
            'section_list',
        )

总结


# 两种方法返回深度,如章节的所有课时
1. 在章节model中定义方法,反向查,并返回列表
2. 序列化课时,

# 筛选(按分类,或者search框)使用django-filter
pip install django-filter
-- 注册  'django_filters',
-- views.py 导入  from django_filters.rest_framework import DjangoFilterBackend
filter_backends = [DjangoFilterBackend]
filter_fields = ('course_category',)

前端的坑:
1. = and == 不能混用!!!!
按价格排序:
<li class="price" :class="(filter.ordering=='price' || filter.ordering=='-price')?'this':''"
                            @click="filter.ordering = (filter.ordering=='-price'?'price':'-price')">价格
                        </li>

2. element-ui 分页总结
前端:
            <div class="course_pagination block">
                <el-pagination
                        @size-change="handleSizeChange"
                        @current-change="handleCurrentChange"
                        :current-page="filter.page"
                        :page-sizes="[1,2, 3, 5, 10]"
                        :page-size="filter.page_size"
                        layout="sizes,prev,pager,next"
                        :total="course_total">
                </el-pagination>
            </div>

            -- 定义变量,每页数量和页码
            filter: {
                    course_category: 0, //当前用户选择的课程分类,默认0
                    ordering: '-id',   // 排序方式
                    page: 1,
                    page_size: 1,
                }

            -- watch(), 每页数量和页码发生变化,必须从新请求后台接口
            watch:{
            // 分类发生变化,调用get_course()方法
            // 排序发生变化,调用get_course()方法
            "filter.page_size":function(){
                this.get_course();
            },
            "filter.page":function(){
                this.get_course();
            }
        },

        -- methods() 每页数量 and  页码发生变化  执行的方法
        handleSizeChange(val) {
                // 每页数据量发生变化时执行的方法
                this.filter.page=1;
                this.filter.page_size = val;
                console.log(`每页 ${val} 条`);
            },
            handleCurrentChange(val) {
                // 页码发生变化时执行的方法
                this.filter.page = val;
                console.log(`当前页: ${val}`);
            }

后台:
-- 新建paginator.py
from rest_framework.pagination import PageNumberPagination
class CoursePageNumberPagination(PageNumberPagination):
    page_size = 1
    page_query_param = 'page'
    page_size_query_param = 'page_size'
    max_page_size = 20
-- 视图函数中使用
class CourseAPIView(ListAPIView):
    queryset = models.Course.objects.filter(is_delete=False,is_show=True)
    serializer_class = serializers.CourseSerializer
    # 分页
    pagination_class = CoursePageNumberPagination

排序:GET /course/courses/?ordering=-id&page_size=1&page=1

class CourseAPIView(ListAPIView):
    queryset = models.Course.objects.filter(is_delete=False,is_show=True)
    serializer_class = serializers.CourseSerializer

    pagination_class = CoursePageNumberPagination

    # 排序 'ORDERING_PARAM': 'ordering',所以get 参数 ordering = '-id'
    filter_backends = [OrderingFilter]
    ordering_fields = ('id','price','students')

posted on 2019-11-25 11:48  Afrafre  阅读(16)  评论(0编辑  收藏  举报