路由: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', )
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')