1. 程式人生 > 實用技巧 >luffy-課程表分析

luffy-課程表分析

課程表分析

course/models.py

from django.db import models

# Create your models here.
# class Course(models.Model):
#     name = models.CharField(max_length=64)
#     title = models.CharField(max_length=64)
#     level = models.IntegerField(choices=((0, '入門'), (1, '進階')), default=0)
#     detail = models.TextField()  # 可以關聯詳情表
# type = models.IntegerField(choices=((0, 'Python'), (1, 'Linux')), default=0) # is_show = models.BooleanField(default=False) # # # 優化欄位 # # 記錄學習課程的學生人數 # students = models.IntegerField(default=0) # # time課程總學時 # time = models.IntegerField(default=0) # # class Meta: # abstract = True
# # # # 免費課 # class FreeCourse(Course): # image = models.ImageField(upload_to='course/free') # attachment = models.FileField(upload_to='attachment') # # # # 實戰課 # class ActualCourse(Course): # image = models.ImageField(upload_to='course/actual') # price = models.DecimalField(max_digits=7, decimal_places=2)
# # cost = models.DecimalField(max_digits=7, decimal_places=2) # # # # 輕課 # class LightCourse(Course): # image = models.ImageField(upload_to='course/light') # price = models.DecimalField(max_digits=7, decimal_places=2) # # cost = models.DecimalField(max_digits=7, decimal_places=2) # period = models.IntegerField(verbose_name='學習建議週期(month)', default=0) # 評論表:分三個表、(id,ctx,date,user_id,free_course_id, comment_id) # 老師表:在課程表建立多對一外來鍵 # 章節表:在章節表建立多對一外來鍵關聯課程 # 課時表:在課時表建立多對一外來鍵關聯章節 from luffyapi.utils.models import BaseModel # 實際luffy中的表,免費課的 class CourseCategory(BaseModel): """ 課程分類 python,linux,go, 網路安全 跟課程是一對多的關係 """ name = models.CharField(max_length=64, unique=True, verbose_name="分類名稱") class Meta: db_table = "luffy_course_category" verbose_name = "分類" verbose_name_plural = verbose_name def __str__(self): return "%s" % self.name class Course(BaseModel): """課程""" course_type = ( (0, '付費'), (1, 'VIP專享'), (2, '學位課程') ) level_choices = ( (0, '初級'), (1, '中級'), (2, '高階'), ) status_choices = ( (0, '上線'), (1, '下線'), (2, '預上線'), ) # 原始欄位 name = models.CharField(max_length=128, verbose_name="課程名稱") course_img = models.ImageField(upload_to="courses", max_length=255, verbose_name="封面圖片", blank=True, null=True) course_type = models.SmallIntegerField(choices=course_type, default=0, verbose_name="付費型別") # 使用這個欄位的原因 brief = models.TextField(max_length=2048, verbose_name="詳情介紹", null=True, blank=True) level = models.SmallIntegerField(choices=level_choices, default=0, verbose_name="難度等級") pub_date = models.DateField(verbose_name="釋出日期", auto_now_add=True) period = models.IntegerField(verbose_name="建議學習週期(day)", default=7) attachment_path = models.FileField(upload_to="attachment", max_length=128, verbose_name="課件路徑", blank=True, null=True) status = models.SmallIntegerField(choices=status_choices, default=0, verbose_name="課程狀態") price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name="課程原價", default=0) # 優化欄位 students = models.IntegerField(verbose_name="學習人數", default=0) sections = models.IntegerField(verbose_name="總課時數量", default=0) pub_sections = models.IntegerField(verbose_name="課時更新數量", default=0) # 關聯欄位 teacher = models.ForeignKey("Teacher", on_delete=models.DO_NOTHING, null=True, blank=True, verbose_name="授課老師", db_constraint=False) course_category = models.ForeignKey("CourseCategory", on_delete=models.SET_NULL, db_constraint=False, null=True, blank=True, verbose_name="課程分類") class Meta: db_table = "luffy_course" verbose_name = "課程" verbose_name_plural = "課程" def __str__(self): return "%s" % self.name @property def course_type_name(self): return self.get_course_type_display() @property def level_name(self): return self.get_level_display() @property def status_name(self): return self.get_status_display() @property def section_list(self): ll = [] # 根據課程取出所有章節(正向查詢,欄位名.all()) course_chapter_list = self.coursechapters.all() for course_chapter in course_chapter_list: # 通過章節物件,取到章節下所有的課時(反向查詢) # course_chapter.表名小寫_set.all() 現在變成了course_chapter.coursesections.all() course_sections_list = course_chapter.coursesections.all() for course_section in course_sections_list: ll.append({ 'name': course_section.name, 'section_link': course_section.section_link, 'duration': course_section.duration, 'free_trail': course_section.free_trail, }) if len(ll) >= 4: return ll return ll class Teacher(BaseModel): """ 導師 跟課程一對多,關聯欄位寫在課程表中 """ role_choices = ( (0, '講師'), (1, '導師'), (2, '班主任'), ) name = models.CharField(max_length=32, verbose_name="導師名") role = models.SmallIntegerField(choices=role_choices, default=0, verbose_name="導師身份") title = models.CharField(max_length=64, verbose_name="職位、職稱") signature = models.CharField(max_length=255, verbose_name="導師簽名", help_text="導師簽名", blank=True, null=True) image = models.ImageField(upload_to="teacher", null=True, verbose_name="導師封面") brief = models.TextField(max_length=1024, verbose_name="導師描述") class Meta: db_table = "luffy_teacher" verbose_name = "導師" verbose_name_plural = verbose_name def __str__(self): return "%s" % self.name def role_name(self): # 返回角色的中文 return self.get_role_display() class CourseChapter(BaseModel): """ 章節 章節跟課程是一(課程)對多(章節多) """ course = models.ForeignKey("Course", related_name='coursechapters', on_delete=models.CASCADE, verbose_name="課程名稱", db_constraint=False) chapter = models.SmallIntegerField(verbose_name="第幾章", default=1) name = models.CharField(max_length=128, verbose_name="章節標題") summary = models.TextField(verbose_name="章節介紹", blank=True, null=True) pub_date = models.DateField(verbose_name="釋出日期", auto_now_add=True) class Meta: db_table = "luffy_course_chapter" verbose_name = "章節" verbose_name_plural = verbose_name def __str__(self): return "%s:(第%s章)%s" % (self.course, self.chapter, self.name) class CourseSection(BaseModel): """ 課時 章節和課時是一對多的關係,關聯欄位寫在多的一方,課時 """ section_type_choices = ( (0, '文件'), (1, '練習'), (2, '視訊') ) chapter = models.ForeignKey("CourseChapter", related_name='coursesections', on_delete=models.CASCADE, verbose_name="課程章節", db_constraint=False) name = models.CharField(max_length=128, verbose_name="課時標題") orders = models.PositiveSmallIntegerField(verbose_name="課時排序") section_type = models.SmallIntegerField(default=2, choices=section_type_choices, verbose_name="課時種類") section_link = models.CharField(max_length=255, blank=True, null=True, verbose_name="課時連結", help_text="若是video,填vid,若是文件,填link") duration = models.CharField(verbose_name="視訊時長", blank=True, null=True, max_length=32) # 僅在前端展示使用 pub_date = models.DateTimeField(verbose_name="釋出時間", auto_now_add=True) free_trail = models.BooleanField(verbose_name="是否可試看", default=False) class Meta: db_table = "luffy_course_Section" verbose_name = "課時" verbose_name_plural = verbose_name def __str__(self): return "%s-%s" % (self.chapter, self.name)

基表utils/models.py

from django.db import models


# 後期課程表,輪播圖表,都會用到這些欄位

class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False, verbose_name='是否刪除')
    is_show = models.BooleanField(default=True, verbose_name='是否展示')
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='建立時間')
    updated_time = models.DateTimeField(auto_now=True, verbose_name='最後更新時間')
    orders = models.IntegerField()

    class Meta:
        abstract = True  # 一定不要忘了

資料遷移

# python manage.py makemigrations
# python manage.py migrate

註冊models:course/adminx.py

import xadmin
from . import models

xadmin.site.register(models.CourseCategory)
xadmin.site.register(models.Course)
xadmin.site.register(models.Teacher)
xadmin.site.register(models.CourseChapter)
xadmin.site.register(models.CourseSection)