1.课程
1.1 在syl/apps
创建应用course
python ../manage.py startapps course
1.2 在syl/settings.py
中注册应用
INSTALLED_APPS = [
'course.apps.CourseConfig',
]
1.3 在syl/urls.py
配置路由
urlpatterns = [
path('course/', include('course.urls')),
]
1.4 在course/models.py
创建模型
from django.db import models
class Base(models.Model):
create_time = models.TimeField(auto_now_add=True)
update_time = models.TimeField(auto_now=True)
class Meta:
abstract = True
class CourseType(Base):
title = models.CharField('课程类别', max_length=16)
sequence = models.IntegerField('展示顺序', default=18)
class Meta:
db_table = 'tb_coursetype'
verbose_name_plural = '类别'
def __str__(self):
return self.title
class CourseTag(Base):
title = models.CharField('课程标签', max_length=16)
sequence = models.IntegerField('展示顺序', default=18)
class Meta:
db_table = 'tb_coursetag'
verbose_name_plural = '标签'
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.ImageField('课程logo', upload_to='course', 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'
verbose_name_plural = '课程'
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'
verbose_name_plural = '章'
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.FileField('上传视频',upload_to='videos/%Y%m%d/',blank=True,max_length=1024)
seq_num = models.IntegerField('序号',default=1)
class Meta:
db_table = 'tb_sections'
verbose_name_plural = '节'
def __str__(self):
return self.title
1.5 在serializers.py
序列化
from rest_framework import serializers
from course.models import *
class CourseTypeSerializers(serializers.ModelSerializer):
class Meta:
model = CourseType
fields = '__all__'
class CourseTagSerializers(serializers.ModelSerializer):
class Meta:
model = CourseTag
fields = '__all__'
class CourseSerializers(serializers.ModelSerializer):
class Meta:
model = Course
fields = '__all__'
class SectionsSerializers(serializers.ModelSerializer):
class Meta:
model = Sections
fields = '__all__'
class ChaptersSerializers(serializers.ModelSerializer):
sections = SectionsSerializers(many=True)
class Meta:
model = Chapters
fields = '__all__'
class CourseDeepSerializer(CourseSerializers):
chapters = ChaptersSerializers(many=True)
1.6 course/views.py
视图函数
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from rest_framework import viewsets
from rest_framework.pagination import PageNumberPagination
from course.models import *
from course.serializers import *
class PageNum(PageNumberPagination):
page_size_query_param = 'page_size'
class CourseTypeViewSet(viewsets.ModelViewSet):
queryset = CourseType.objects.all()
serializer_class = CourseTypeSerializers
class CourseTagViewSet(viewsets.ModelViewSet):
queryset = CourseTag.objects.all()
serializer_class = CourseTagSerializers
class CourseViewSet(viewsets.ModelViewSet):
queryset = Course.objects.all()
serializer_class = CourseSerializers
filter_backends = (DjangoFilterBackend, OrderingFilter)
ordering_fiel = ('attention', 'learner', 'id')
filter_fields = ('title', 'desc', 'status', 'course_type', 'course_tag')
pagination_class = PageNum
def get_serializer_class(self):
if self.action == 'list':
return CourseSerializers
else:
return CourseDeepSerializer
class SectionsViewSet(viewsets.ModelViewSet):
queryset = Sections.objects.all()
serializer_class = SectionsSerializers
class ChaptersViewSet(viewsets.ModelViewSet):
queryset = Chapters.objects.all()
serializer_class = ChaptersSerializers
1.7 在course/urls.py
中配置路由
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
router.register(r'type',views.CourseTypeViewSet)
router.register(r'tag',views.CourseTagViewSet)
router.register(r'course',views.CourseViewSet)
router.register(r'chapters',views.ChaptersViewSet)
router.register(r'sections',views.SectionsViewSet)
urlpatterns = [
]
urlpatterns += router.urls
1.8 在course/admin.py
注册后台管理
from django.contrib import admin
from .models import *
admin.site.register(CourseType)
admin.site.register(CourseTag)
admin.site.register(Course)
admin.site.register(Chapters)
admin.site.register(Sections)
2.路径与阶段
2.1 在course/models
中创建表模型
from django.db import models
class Base(models.Model):
create_time = models.TimeField(auto_now_add=True)
update_time = models.TimeField(auto_now=True)
class Meta:
abstract = True
class Path(Base):
title = models.CharField('路径名',max_length=16)
img = models.ImageField('路径图片',upload_to='path',null=True)
desc = models.CharField('路径描述',max_length=255)
user = models.ManyToManyField('user.User',blank=True)
def course_total(self):
count = 0
for jd in self.jieduan.all():
count = count+ jd.course.count()
return count
class Meta:
db_table = 'tb_path'
verbose_name_plural = '路径'
def __str__(self):
return self.title
class JieDuan(Base):
title = models.CharField('阶段名',max_length=16)
serial_num = models.IntegerField('阶段序号')
path = models.ForeignKey(Path,related_name='jieduan',on_delete=models.SET_NULL,null=True)
courses = models.ManyToManyField(Course,blank=True)
class Meta:
db_table = 'tb_jieduan'
verbose_name_plural = '阶段'
def __str__(self):
return '%s-第%s阶段-%s' % (self.path.title,self.serial_num,self.title)
2.2 在serializers.py
序列化
from rest_framework import serializers
from course.models import *
class PathSerializers(serializers.ModelSerializer):
class Meta:
model = Path
fields = '__all__'
class JieDuanSerializers(serializers.ModelSerializer):
courses = CourseSerializers(many=True)
class Meta:
model = JieDuan
fields = '__all__'
class PathDeepSerializer(PathSerializers):
jieduan = JieDuanSerializers(many=True)
2.3 course/views.py
视图函数
class PathViewSet(viewsets.ModelViewSet):
queryset = Path.objects.all()
serializer_class = PathSerializers
def get_serializer_class(self):
if self.action == 'list':
return PathSerializers
else:
return PathDeepSerializer
class JieDuanViewSet(viewsets.ModelViewSet):
queryset = JieDuan.objects.all()
serializer_class = JieDuanSerializers
2.4 在course/urls.py
中配置路由
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
router.register(r'path',views.PathViewSet)
router.register(r'jieduan',views.JieDuanViewSet)
urlpatterns = [
]
urlpatterns += router.urls
2.5 在course/admin.py
注册后台管理
from django.contrib import admin
from .models import *
admin.site.register(Path)
admin.site.register(JieDuan)
3.增加media文件配置
3.1syl/settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
3.2syl/urls.py
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
]
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)