设计表结构有几个重要的点
image.png
课程
<一对多>章节 <一对多>视频 <一对一>课程资源
image.png

Course/model

旧 models.py

from datetime import datetime

from django.db import models


# 1.设计表结构有几个重要的点
# 实体1 <关系> 实体2
# 课程
# <一对多>章节 <一对多>视频 <一对一>课程资源(所以这个直接加在课程表里面)
# 2. 实体的具体字段
# 3. 每个字段的类型,是否必填

class BaseModel(models.Model):
    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')

    # 添加了这个就不会生成BaseModel的表
    class Meta:
        abstract = True


class Course(BaseModel):
# add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')  # 不要使用datetime.now(
# )方法,若使用,则在调用的时候就已经设置好了,但我们希望在生成实例的时候才后填
# 应该之后的绝大部分都需要使用到这个add_time,所以我们采用django model的继承机制来继承这个实体

之后的绝大部分都需要使用到这个add_time,所以我们采用django model的继承机制来继承这个实体,所以将其提取为BaseMode。

使用abstract = True来防止BaseModel被生成单独的表。

因为BaseModel会被其他层的model所引用,所以把他放到最下面的user层.然后在course中引入users.model的BaseModel

开始设计新Model

由网站所有的信息来编写字段
image.png
image.png

新models.py

from datetime import datetime

from django.db import models

from apps.users.models import BaseModel


# 1.设计表结构有几个重要的点
# 实体1 <关系> 实体2
# 课程
# <一对多>章节 <一对多>视频 <一对一>课程资源(所以这个直接加在课程表里面)
# 2. 实体的具体字段
# 3. 每个字段的类型,是否必填

class Course(BaseModel):
    # add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')  # 不要使用datetime.now(
    # )方法,若使用,则在调用的时候就已经设置好了,但我们希望在生成实例的时候才后填
    # 应该之后的绝大部分都需要使用到这个add_time,所以我们采用django model的继承机制来继承这个实体
    # 因为`BaseModel`会被其他层的model所引用,所以把他放到最下面的`user`层.然后在course中引入users.model的BaseModel

    name = models.CharField(verbose_name='课程名', max_length=50)
    desc = models.CharField(verbose_name='课程描述', max_length=300)
    # 最好是以最小单位来保存时长,在显示的时候再将其转换为小时或分钟
    learn_times = models.IntegerField(default=0, verbose_name='学习时长(分钟数)')
    degree = models.CharField(verbose_name="难度", choices=(("cj", "初级"), ("zj", "中级"), ("gj", "高级")), max_length=2)
    students = models.IntegerField(default=0, verbose_name='学习人数')
    fav_nums = models.IntegerField(default=0, verbose_name='收藏人数')
    click_nums = models.IntegerField(default=0, verbose_name="点击数")
    notice = models.CharField(verbose_name="课程公告", max_length=300, default="")
    category = models.CharField(default=u"后端开发", max_length=20, verbose_name="课程类别")
    tag = models.CharField(default="", verbose_name="课程标签", max_length=10)  # 用于相关课程的推荐
    youneed_know = models.CharField(default="", max_length=300, verbose_name="课程须知")
    teacher_tell = models.CharField(default="", max_length=300, verbose_name="老师告诉你")
    is_classics = models.BooleanField(default=False, verbose_name="是否经典")
    detail = models.TextField(verbose_name="课程详情", default="")
    image = models.ImageField(upload_to="courses/%Y/%m", verbose_name="封面图", max_length=100)

    class Meta:
        verbose_name = '课程信息'
        verbose_name_plural = verbose_name


class Lesson(BaseModel):
    course = models.ForeignKey(Course, on_delete=models.CASCADE)  # on_delete表示对应的外键数据被删除后,当前的数据应该怎么办
    name = models.CharField(max_length=100, verbose_name="章节名")
    learn_times = models.IntegerField(default=0, verbose_name="学习时长(分钟数)")

    class Meta:
        verbose_name = '课程章节'
        verbose_name_plural = verbose_name


class Video(BaseModel):
    lesson = models.ForeignKey(Lesson, verbose_name='章节', on_delete=models.CASCADE)  # on_delete表示对应的外键数据被删除后,当前的数据应该怎么办
    name = models.CharField(max_length=100, verbose_name="视频名")
    learn_times = models.IntegerField(default=0, verbose_name="学习时长(分钟数)")
    url = models.CharField(max_length=200, verbose_name='访问地址')

    class Meta:
        verbose_name = '视频'
        verbose_name_plural = verbose_name


class CourseResource(BaseModel):
    course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name="课程")
    name = models.CharField(max_length=100, verbose_name=u"名称")
    file = models.FileField(upload_to="course/resource/%Y/%m", verbose_name="下载地址", max_length=200)

    class Meta:
        verbose_name = "课程资源"
        verbose_name_plural = verbose_name

袅残烟
42 声望4 粉丝