实验楼--课程功能

1.课程主⻚⾯3张表

在这里插入图片描述

2.课程章节表2张表

在这里插入图片描述

3、表设计

courseapp/models.py

from django.db import models
from utils.MyBaseModel import Base
from userapp.models import User



#课程类别
class CourseType(Base):
    title = models.CharField('课程类别', max_length=16)
    sequence = models.IntegerField('展示顺序', default=10)

    class Meta:
        db_table = 'tb_coursetype'

    def __str__(self):
        return self.title

#课程标签
class CourseTag(Base):
    title = models.CharField('课程标签', max_length=16)
    sequence = models.IntegerField('展示顺序', default=10)

    class Meta:
        db_table = 'tb_coursetag'

    def __str__(self):
        return self.title


#课程表
class Course(Base):
    STATUS = (
        ('0', '即将上线'),
        ('1', '已上线'),
        ('2', '已下线'),
    )

    title = models.CharField('课程名', max_length=24)
    desc = models.CharField('课程描述', max_length=256)
    img = models.CharField('课程logo', max_length=512, null=True)
    course_type = models.ForeignKey(CourseType, verbose_name='课程类型', on_delete=models.SET_NULL, default=None, null=True)
    course_tag = models.ManyToManyField(CourseTag, verbose_name='课程标签')
    status = models.CharField('课程状态', choices=STATUS, max_length=8, default='1')
    attention = models.IntegerField('关注人数', default=0)
    learner = models.IntegerField('学习人数', default=0)

    class Meta:
        db_table = 'tb_course'

    def __str__(self):
        return self.title

#章表
class Chapters(Base):
    title = models.CharField('章标题', max_length=24)
    serial_num = models.IntegerField('章序号')
    course = models.ForeignKey(Course, related_name='chapters', on_delete=models.SET_NULL, null=True)

    class Meta:
        db_table = 'tb_chapters'

    def __str__(self):
        return self.title

#节表
class Sections(Base):
    title = models.CharField('节标题', max_length=24)
    serial_num = models.IntegerField('节序号')
    chapters = models.ForeignKey(Chapters, related_name='sections', on_delete=models.SET_NULL, null=True)
    learn_time = models.IntegerField('课程时长', default=1)
    video = models.CharField("上传视频", blank=True, max_length=1024,null=True)
    seq_num = models.IntegerField("序号", default=1)

    class Meta:
        db_table = 'tb_sections'

    def __str__(self):
        return self.title

4、使⽤modelviewset添加类别,标签,课程,章,节等表

courseapp/serializers.py

from rest_framework import serializers
from courseapp import models


class CourserTypeSer(serializers.ModelSerializer):
    class Meta:
        model = models.CourseType
        fields = '__all__'


class CourseTagSer(serializers.ModelSerializer):
    class Meta:
        model = models.CourseTag
        fields = '__all__'


class CourseSer(serializers.ModelSerializer):
    class Meta:
        model = models.Course
        fields = '__all__'


class ChaptersSer(serializers.ModelSerializer):
    class Meta:
        model = models.Chapters
        fields = '__all__'


class SectionsSer(serializers.ModelSerializer):
    class Meta:
        model = models.Sections
        fields = '__all__'


class ChaptersSerializer(serializers.ModelSerializer):
    sections = SectionsSer(read_only=True, many=True)

    class Meta:
        model = models.Chapters
        fields = '__all__'


class CourseDeepSerializer(serializers.ModelSerializer):
    chapters = ChaptersSerializer(read_only=True, many=True)

    class Meta:
        model = models.Course
        fields = '__all__'

courseapp/views.py

from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.pagination import PageNumberPagination
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet

from courseapp import models, serializers


class PageNum(PageNumberPagination):
    page_size_query_param = 'page_size'


class CourseTypeView(ModelViewSet):
    queryset = models.CourseType.objects.all()
    serializer_class = serializers.CourserTypeSer


class CourseTagView(ModelViewSet):
    queryset = models.CourseTag.objects.all()
    serializer_class = serializers.CourseTagSer


class CourseView(ModelViewSet):
    queryset = models.Course.objects.all()
    serializer_class = serializers.CourseSer
    filter_backends = (DjangoFilterBackend, OrderingFilter)  # 同时支持过滤和排序
    # permission_classes = [IsAuthenticated]

    # 指定排序字段, 不设置, 排序功能不起效
    ordering_fields = ('attention', 'learner', 'create_time')
    # 指定过滤字段, 不设置, 过滤功能不起效
    filter_fields = ('title', 'desc', 'status', 'course_type', 'course_tag')
    pagination_class = PageNum
    def get_serializer_class(self):
        if self.action == 'retrieve':
            return serializers.CourseDeepSerializer
        else:
            return serializers.CourseSer

class ChaptersView(ModelViewSet):
    queryset = models.Chapters.objects.all()
    serializer_class = serializers.ChaptersSer


class SectionsView(ModelViewSet):
    queryset = models.Sections.objects.all()
    serializer_class = serializers.SectionsSer

courseapp/urls.py

from courseapp import views
from django.urls import path, include

from rest_framework.routers import DefaultRouter

routers = DefaultRouter()
routers.register('type', views.CourseTypeView)   # 课程类别
routers.register('tag', views.CourseTagView)    # 课程标签
routers.register('course', views.CourseView)       # 课程
routers.register('chapter', views.ChaptersView)     # 章
routers.register('sections', views.SectionsView)    # 节

urlpatterns = [
    path('', include(routers.urls))
]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值