• 项目课程模块(二)


    一、课程详情接口

    1、添加课程详情url

      LuffyCity/Course/urls.py文件中添加课程详情url,携带course_id:

    from django.urls import path
    from .views import CategoryView, CourseView, CourseDetailView
    
    
    urlpatterns = [
        path('category', CategoryView.as_view()),   # 课程分类
        path('list', CourseView.as_view()),         # 查看课程
        path('detail/<int:pk>', CourseDetailView.as_view())       # 查看课程详情,携带course_id
    ]

    2、添加课程详情序列化器

      在LuffyCity/Course/serializers.py文件中添加如下内容:

    class CourseDetailSerializer(serializers.ModelSerializer):
        level = serializers.CharField(source="course.get_level_display")    # 难度
        study_num = serializers.IntegerField(source="course.study_num")     # 学习人数
        recommend_courses = serializers.SerializerMethodField()             # 推荐课程
        teachers = serializers.SerializerMethodField()                      # 课程老师
        price_policy = serializers.SerializerMethodField()                  # 价格策略
        course_outline = serializers.SerializerMethodField()                # 课程大纲
    
        def get_recommend_courses(self, obj):
            # 获取所有的推荐课程,主要是获取两个字段:id、title
            return [{"id": course.id, "title": course.title} for course in obj.recommend_courses.all()]
    
        def get_teachers(self, obj):
            # 获取课程老师id和名字
            return [{"id": teacher.id, "name": teacher.name} for teacher in obj.teachers.all()]
    
        def get_price_policy(self, obj):
            # 获取价格策略,获取价格策略周期(中文显示)、价格信息
            return [
                {
                    "id": price.id,
                    "valid_price_display": price.get_valid_period_display(),   # 价格周期添加'_display',可不显示数字,显示中文
                    "price": price.price
                } for price in obj.course.price_policy.all()]
    
        def get_course_outline(self, obj):
            # 获取课程大纲,课程大纲和课程详情表是外键绑定关系
            return [
                {
                    "id": outline.id,
                    "title": outline.title,
                    "content": outline.content
                 } for outline in obj.course_outline.all().order_by("order")]   # 拿到所有大纲,以order排序
    
        class Meta:
            model = models.CourseDetail
            fields = ["id", "hours", "summary", "level", "study_num", "recommend_courses", "teachers",
                      "price_policy", "course_outline", ]

    3、添加课程详情视图

      在LuffyCity/Course/views.py中添加如下内容:

    from .serializers import CategorySerializer, CourseSerializer, CourseDetailSerializer   # 引入序列化器
    
    class CourseDetailView(APIView):
        def get(self, request, pk):
            # 根据pk获取课程详情对象
            course_detail_obj = models.CourseDetail.objects.filter(course__id=pk).first()
            if not course_detail_obj:
                return Response({"code": 1001, "error": "查询的课程详情不存在"})
            # 序列化课程详情
            ser_obj = CourseDetailSerializer(course_detail_obj)
            # 返回
            return Response(ser_obj.data)

    4、接口访问效果 

      使用admin组件添加课程详情数据,再使用postman调用接口访问数据,效果如下所示:

      

    二、课程章节接口

    1、添加课程章节url

      LuffyCity/Course/urls.py文件中添加课程章节url:

    from django.urls import path
    from .views import CategoryView, CourseView, CourseDetailView, CourseChapterView
    
    
    urlpatterns = [
        path('category', CategoryView.as_view()),   # 课程分类
        path('list', CourseView.as_view()),         # 查看课程
        path('detail/<int:pk>', CourseDetailView.as_view()),       # 查看课程详情,携带course_id
        path('chapter/<int:pk>', CourseChapterView.as_view())      # 课程章节
    ]

    2、课程章节序列化器

      在LuffyCity/Course/serializers.py文件中添加如下内容:

    class CourseChapterSeriallizer(serializers.ModelSerializer):
        sections = serializers.SerializerMethodField()
    
        def get_sections(self, obj):
            return [
                {
                    "id": section.id,
                    "title": section.title,
                    "free_trail": section.free_trail
                } for section in obj.course_sections.all().order_by("section_order")]
    
        class Meta:
            model = models.CourseChapter
            fields = ["id", "title", "sections"]

    3、课程章节视图

    class CourseChapterView(APIView):
        def get(self, request, pk):
            # ["第一章": {课时一, 课时二}]
            queryset = models.CourseChapter.objects.filter(course_id=pk).all().order_by("chapter")
            # 序列化章节对象
            ser_obj = CourseChapterSeriallizer(queryset, many=True)
            # 返回
            return Response(ser_obj.data) 

    4、接口访问效果

      

    三、评论及常见问题接口

    1、添加评论和常见问题url

      LuffyCity/Course/urls.py文件中添加课程评论和常见问题url:

    from django.urls import path
    from .views import *
    
    
    urlpatterns = [
        path('category', CategoryView.as_view()),   # 课程分类
        path('list', CourseView.as_view()),         # 查看课程
        path('detail/<int:pk>', CourseDetailView.as_view()),       # 查看课程详情,携带course_id
        path('chapter/<int:pk>', CourseChapterView.as_view()),     # 课程章节
        path('comment/<int:pk>', CourseCommentView.as_view()),     # 课程评论
        path('question/<int:pk>', QuestionView.as_view())          # 常见问题
    ]

    2、课程评论和常见问题序列化器

      在LuffyCity/Course/serializers.py文件中添加如下内容:

    class CourseCommentSerializer(serializers.ModelSerializer):
        # 评论表保存的account是foreignkey,需要处理
        account = serializers.CharField(source="account.username")  # 如果需要展示用户更多信息,可设置为SerializerMethodField做处理
    
        class Meta:
            model = models.Comment
            fields = ["id", "account", "content", "date"]
    
    
    class QuestionSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.OftenAskedQuestion
            fields = ["id", "question", "answer"]

    3、课程评论和常见问题视图

    class CourseCommentView(APIView):
        def get(self, request, pk):
            # 通过课程id找到课程所有的评论——先拿到课程对象,再通过课程对象获取所有的评论
            queryset = models.Course.objects.filter(id=pk).first().course_comments.all()
            # 序列化
            ser_obj = CourseCommentSerializer(queryset, many=True)
            # 返回
            return Response(ser_obj.data)
    
    
    class QuestionView(APIView):
        def get(self, request, pk):
            # 通过课程找到所有的课程常见问题
            queryset = models.Course.objects.filter(id=pk).first().often_ask_questions.all()   # 反向查询拿到常见问题
            # 序列化
            ser_obj = QuestionSerializer(queryset, many=True)
            # 返回
            return Response(ser_obj.data)

    4、接口访问效果

    (1)评论接口

      

    (2)常见问题接口

      

  • 相关阅读:
    poj(1458)(最长公共子序列)
    二叉搜索树
    hdu1087
    poj3641(学习了)
    平年和闰年的由来。。。。
    Linux system函数返回值(转)
    VS2010单元测试(转)
    QT QTableWidget 用法总结(转)
    QT显示图片(转)
    Qt正则表达式类QRegExp(转)
  • 原文地址:https://www.cnblogs.com/xiugeng/p/11605988.html
Copyright © 2020-2023  润新知