zoukankan      html  css  js  c++  java
  • python后端model模板

    from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
    from django.contrib.contenttypes.models import ContentType
    from django.db.models import Q
    from django.utils.safestring import mark_safe
    from django.db import models
    import hashlib
    
    
    #
    class CourseCategory(models.Model):
        """课程大类, e.g 前端  后端..."""
        name = models.CharField(max_length=64, unique=True)
    
        def __str__(self):
            return "%s" % self.name
    
        class Meta:
            verbose_name_plural = "01.课程大类"
    
    
    class CourseSubCategory(models.Model):
        """课程子类, e.g python linux """
        category = models.ForeignKey("CourseCategory", on_delete=models.CASCADE)
        name = models.CharField(max_length=64, unique=True)
    
        def __str__(self):
            return "%s" % self.name
    
        class Meta:
            verbose_name_plural = "02.课程子类"
    
    
    class DegreeCourse(models.Model):
        """学位课程"""
        name = models.CharField(max_length=128, unique=True)
        course_img = models.CharField(max_length=255, verbose_name="缩略图")
        brief = models.TextField(verbose_name="学位课程简介", )
        total_scholarship = models.PositiveIntegerField(verbose_name="总奖学金(贝里)", default=40000)
        mentor_compensation_bonus = models.PositiveIntegerField(verbose_name="本课程的导师辅导费用(贝里)", default=15000)
        period = models.PositiveIntegerField(verbose_name="建议学习周期(days)", default=150)  # 为了计算学位奖学金
        prerequisite = models.TextField(verbose_name="课程先修要求", max_length=1024)
        teachers = models.ManyToManyField("Teacher", verbose_name="课程讲师")
    
        # 用于GenericForeignKey反向查询, 不会生成表字段,切勿删除
        # coupon = GenericRelation("Coupon")
    
        # 用于GenericForeignKey反向查询,不会生成表字段,切勿删除
        degreecourse_price_policy = GenericRelation("PricePolicy")
    
        # 查询常见问题
        asked_question = GenericRelation("OftenAskedQuestion")
    
        def __str__(self):
            return self.name
    
        class Meta:
            verbose_name_plural = "03.学位课"
    
    
    #
    class Teacher(models.Model):
        """讲师、导师表"""
        name = models.CharField(max_length=32)
        role_choices = ((0, '讲师'), (1, '导师'))
        role = models.SmallIntegerField(choices=role_choices, default=0)
        title = models.CharField(max_length=64, verbose_name="职位、职称")
        signature = models.CharField(max_length=255, help_text="导师签名", blank=True, null=True)
        image = models.CharField(max_length=128)
        brief = models.TextField(max_length=1024)
    
        def __str__(self):
            return self.name
    
        class Meta:
            verbose_name_plural = "04.导师或讲师"
    
    
    class Scholarship(models.Model):
        """学位课程奖学金"""
        degree_course = models.ForeignKey("DegreeCourse", on_delete=models.CASCADE)
        time_percent = models.PositiveSmallIntegerField(verbose_name="奖励档位(时间百分比)", help_text="只填百分值,如80,代表80%")
        value = models.PositiveIntegerField(verbose_name="奖学金数额")
    
        def __str__(self):
            return "%s:%s" % (self.degree_course, self.value)
    
        class Meta:
            verbose_name_plural = "05.学位课奖学金"
    
    
    class Course(models.Model):
        """专题课程 OR 学位课模块"""
        name = models.CharField(max_length=128, unique=True)  # Python基础
        course_img = models.CharField(max_length=255)
    
        sub_category = models.ForeignKey("CourseSubCategory", on_delete=models.CASCADE)  #
    
        course_type_choices = ((0, '付费'), (1, 'VIP专享'), (2, '学位课程'))
        course_type = models.SmallIntegerField(choices=course_type_choices)
    
        degree_course = models.ForeignKey("DegreeCourse", blank=True, null=True, help_text="若是学位课程,此处关联学位表",
                                          on_delete=models.CASCADE)
    
        brief = models.TextField(verbose_name="课程(模块)概述", max_length=2048)
        level_choices = ((0, '初级'), (1, '中级'), (2, '高级'))
        level = models.SmallIntegerField(choices=level_choices, default=1)
        pub_date = models.DateField(verbose_name="发布日期", blank=True, null=True)
        period = models.PositiveIntegerField(verbose_name="建议学习周期(days)", default=7)
        order = models.IntegerField("课程顺序", help_text="从上一个课程数字往后排")
        attachment_path = models.CharField(max_length=128, verbose_name="课件路径", blank=True, null=True)
        status_choices = ((0, '上线'), (1, '下线'), (2, '预上线'))
        status = models.SmallIntegerField(choices=status_choices, default=0)
        template_id = models.SmallIntegerField("前端模板id", default=1)
    
        # 如果是专题课时,获取相关优惠券
        # coupon = GenericRelation("Coupon")
    
        # 用于GenericForeignKey反向查询,不会生成表字段,切勿删除
        price_policy = GenericRelation("PricePolicy")
    
        # 查询常见问题
        asked_question = GenericRelation("OftenAskedQuestion")
    
        def __str__(self):
            return "%s(%s)" % (self.name, self.get_course_type_display())
    
        class Meta:
            verbose_name_plural = "06.专题课或学位课模块"
    
    
    class CourseDetail(models.Model):
        """课程详情页内容"""
        course = models.OneToOneField("Course", on_delete=models.CASCADE)
    
        hours = models.IntegerField("课时")
        course_slogan = models.CharField(max_length=125, blank=True, null=True)
        video_brief_link = models.CharField(verbose_name='课程介绍', max_length=255, blank=True, null=True)
        why_study = models.TextField(verbose_name="为什么学习这门课程")
        what_to_study_brief = models.TextField(verbose_name="我将学到哪些内容")
        career_improvement = models.TextField(verbose_name="此项目如何有助于我的职业生涯")
        prerequisite = models.TextField(verbose_name="课程先修要求", max_length=1024)
        recommend_courses = models.ManyToManyField("Course", related_name="recommend_by", blank=True)
        teachers = models.ManyToManyField("Teacher", verbose_name="课程讲师")
    
        def __str__(self):
            return "%s" % self.course
    
        class Meta:
            verbose_name_plural = "07.课程或学位模块详细"
    
    
    #
    #
    class OftenAskedQuestion(models.Model):
        """常见问题"""
        content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)  # 关联course or degree_course
        object_id = models.PositiveIntegerField()
        content_object = GenericForeignKey('content_type', 'object_id')
    
        question = models.CharField(max_length=255)
        answer = models.TextField(max_length=1024)
    
        def __str__(self):
            return "%s-%s" % (self.content_object, self.question)
    
        class Meta:
            unique_together = ('content_type', 'object_id', 'question')
            verbose_name_plural = "08. 常见问题"
    
    
    class CourseOutline(models.Model):
        """课程大纲"""
        course_detail = models.ForeignKey("CourseDetail", on_delete=models.CASCADE)
    
        # 前端显示顺序
        order = models.PositiveSmallIntegerField(default=1)
    
        title = models.CharField(max_length=128)
        content = models.TextField("内容", max_length=2048)
    
        def __str__(self):
            return "%s" % self.title
    
        class Meta:
            unique_together = ('course_detail', 'title')
            verbose_name_plural = "09. 课程大纲"
    
    
    class CourseChapter(models.Model):
        """课程章节"""
        course = models.ForeignKey("Course", related_name='coursechapters', on_delete=models.CASCADE)
        chapter = models.SmallIntegerField(verbose_name="第几章", default=1)
        name = models.CharField(max_length=128)
        summary = models.TextField(verbose_name="章节介绍", blank=True, null=True)
        pub_date = models.DateField(verbose_name="发布日期", auto_now_add=True)
    
        class Meta:
            unique_together = ("course", 'chapter')
            verbose_name_plural = "10. 课程章节"
    
        def __str__(self):
            return "%s:(第%s章)%s" % (self.course, self.chapter, self.name)
    
    
    class CourseSection(models.Model):
        """课时目录"""
        chapter = models.ForeignKey("CourseChapter", related_name='coursesections', on_delete=models.CASCADE)
        name = models.CharField(max_length=128)
        order = models.PositiveSmallIntegerField(verbose_name="课时排序", help_text="建议每个课时之间空1至2个值,以备后续插入课时")
        section_type_choices = ((0, '文档'), (1, '练习'), (2, '视频'))
        section_type = models.SmallIntegerField(default=2, choices=section_type_choices)
        # 59EE3275E977AADB9C33DC5901307461
        section_link = models.CharField(max_length=255, blank=True, null=True, help_text="若是video,填vid,若是文档,填link")
    
        video_time = 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("是否可试看", default=False)
    
        class Meta:
            unique_together = ('chapter', 'section_link')
            verbose_name_plural = "11. 课时"
    
        def __str__(self):
            return "%s-%s" % (self.chapter, self.name)
    
    
    class Homework(models.Model):
        chapter = models.ForeignKey("CourseChapter", on_delete=models.CASCADE)
        title = models.CharField(max_length=128, verbose_name="作业题目")
        order = models.PositiveSmallIntegerField("作业顺序", help_text="同一课程的每个作业之前的order值间隔1-2个数")
        homework_type_choices = ((0, '作业'), (1, '模块通关考核'))
        homework_type = models.SmallIntegerField(choices=homework_type_choices, default=0)
        requirement = models.TextField(max_length=1024, verbose_name="作业需求")
        threshold = models.TextField(max_length=1024, verbose_name="踩分点")
        recommend_period = models.PositiveSmallIntegerField("推荐完成周期(天)", default=7)
        scholarship_value = models.PositiveSmallIntegerField("为该作业分配的奖学金(贝里)")
        note = models.TextField(blank=True, null=True)
        enabled = models.BooleanField(default=True, help_text="本作业如果后期不需要了,不想让学员看到,可以设置为False")
    
        class Meta:
            unique_together = ("chapter", "title")
            verbose_name_plural = "12. 章节作业"
    
        def __str__(self):
            return "%s - %s" % (self.chapter, self.title)
    
    
    #
    # #
    # # class CourseReview(models.Model):
    # #     """课程评价"""
    # #     enrolled_course = models.OneToOneField("EnrolledCourse")
    # #     about_teacher = models.FloatField(default=0, verbose_name="讲师讲解是否清晰")
    # #     about_video = models.FloatField(default=0, verbose_name="内容实用")
    # #     about_course = models.FloatField(default=0, verbose_name="课程内容通俗易懂")
    # #     review = models.TextField(max_length=1024, verbose_name="评价")
    # #     disagree_number = models.IntegerField(default=0, verbose_name="踩")
    # #     agree_number = models.IntegerField(default=0, verbose_name="赞同数")
    # #     tags = models.ManyToManyField("Tags", blank=True, verbose_name="标签")
    # #     date = models.DateTimeField(auto_now_add=True, verbose_name="评价日期")
    # #     is_recommend = models.BooleanField("热评推荐", default=False)
    # #     hide = models.BooleanField("不在前端页面显示此条评价", default=False)
    # #
    # #     def __str__(self):
    # #         return "%s-%s" % (self.enrolled_course.course, self.review)
    # #
    # #     class Meta:
    # #         verbose_name_plural = "13. 课程评价(购买课程后才能评价)"
    # #
    # #
    # # class DegreeCourseReview(models.Model):
    # #     """学位课程评价
    # #     为了以后可以定制单独的评价内容,所以不与普通课程的评价混在一起,单独建表
    # #     """
    # #     enrolled_course = models.ForeignKey("EnrolledDegreeCourse")
    # #     course = models.ForeignKey("Course", verbose_name="评价学位模块", blank=True, null=True,
    # #                                help_text="不填写即代表评价整个学位课程", limit_choices_to={'course_type': 2})
    # #     about_teacher = models.FloatField(default=0, verbose_name="讲师讲解是否清晰")
    # #     about_video = models.FloatField(default=0, verbose_name="视频质量")
    # #     about_course = models.FloatField(default=0, verbose_name="课程")
    # #     review = models.TextField(max_length=1024, verbose_name="评价")
    # #     disagree_number = models.IntegerField(default=0, verbose_name="踩")
    # #     agree_number = models.IntegerField(default=0, verbose_name="赞同数")
    # #     tags = models.ManyToManyField("Tags", blank=True, verbose_name="标签")
    # #     date = models.DateTimeField(auto_now_add=True, verbose_name="评价日期")
    # #     is_recommend = models.BooleanField("热评推荐", default=False)
    # #     hide = models.BooleanField("不在前端页面显示此条评价", default=False)
    # #
    # #     def __str__(self):
    # #         return "%s-%s" % (self.enrolled_course, self.review)
    # #
    # #     class Meta:
    # #         verbose_name_plural = "14. 学位课评价(购买课程后才能评价)"
    # #
    #
    class PricePolicy(models.Model):
        """价格与有课程效期表"""
        content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)  # 关联course or degree_course
        object_id = models.PositiveIntegerField()
        content_object = GenericForeignKey('content_type', 'object_id')
    
        # course = models.ForeignKey("Course")
        valid_period_choices = ((1, '1天'), (3, '3天'),
                                (7, '1周'), (14, '2周'),
                                (30, '1个月'),
                                (60, '2个月'),
                                (90, '3个月'),
                                (180, '6个月'), (210, '12个月'),
                                (540, '18个月'), (720, '24个月'),
                                )
        valid_period = models.SmallIntegerField(choices=valid_period_choices)
        price = models.FloatField()
    
        class Meta:
            unique_together = ("content_type", 'object_id', "valid_period")
            verbose_name_plural = "15. 价格策略"
    
        def __str__(self):
            return "%s(%s)%s" % (self.content_object, self.get_valid_period_display(), self.price)
    
    
    #
    # # #############深科技############################################
    # class ArticleSource(models.Model):
    #     """文章来源"""
    #     name = models.CharField(max_length=64, unique=True)
    #
    #     class Meta:
    #         verbose_name_plural = "16. 文章来源"
    #
    #     def __str__(self):
    #         return self.name
    #
    # class Article(models.Model):
    #     """文章资讯"""
    #     title = models.CharField(max_length=255, unique=True, db_index=True, verbose_name="标题")
    #     source = models.ForeignKey("ArticleSource", verbose_name="来源")
    #     article_type_choices = ((0, '资讯'), (1, '视频'))
    #     article_type = models.SmallIntegerField(choices=article_type_choices, default=0)
    #     brief = models.TextField(max_length=512, verbose_name="摘要")
    #     head_img = models.CharField(max_length=255)
    #     content = models.TextField(verbose_name="文章正文")
    #     pub_date = models.DateTimeField(verbose_name="上架日期")
    #     offline_date = models.DateTimeField(verbose_name="下架日期")
    #     status_choices = ((0, '在线'), (1, '下线'))
    #     status = models.SmallIntegerField(choices=status_choices, default=0, verbose_name="状态")
    #     order = models.SmallIntegerField(default=0, verbose_name="权重", help_text="文章想置顶,可以把数字调大,不要超过1000")
    #     vid = models.CharField(max_length=128, verbose_name="视频VID", help_text="文章类型是视频, 则需要添加视频VID", blank=True, null=True)
    #     comment_num = models.SmallIntegerField(default=0, verbose_name="评论数")
    #     agree_num = models.SmallIntegerField(default=0, verbose_name="点赞数")
    #     view_num = models.SmallIntegerField(default=0, verbose_name="观看数")
    #     collect_num = models.SmallIntegerField(default=0, verbose_name="收藏数")
    #
    #     # tags = models.ManyToManyField("Tags", blank=True, verbose_name="标签")
    #     date = models.DateTimeField(auto_now_add=True, verbose_name="创建日期")
    #
    #     position_choices = ((0, '信息流'), (1, 'banner大图'), (2, 'banner小图'))
    #     position = models.SmallIntegerField(choices=position_choices, default=0, verbose_name="位置")
    #
    #
    #     #comment = GenericRelation("Comment")
    #
    #     class Meta:
    #         verbose_name_plural = "17. 文章"
    #
    #     def __str__(self):
    #         return "%s-%s" % (self.source, self.title)
    #
    # class Collection(models.Model):
    #     """收藏"""
    #     content_type = models.ForeignKey(ContentType)
    #     object_id = models.PositiveIntegerField()
    #     content_object = GenericForeignKey('content_type', 'object_id')
    #
    #     account = models.ForeignKey("Account")
    #     date = models.DateTimeField(auto_now_add=True)
    #
    #     class Meta:
    #         unique_together = ('content_type', 'object_id', 'account')
    #         verbose_name_plural = "18. 通用收藏表"
    #
    # class Comment(models.Model):
    #     """通用的评论表"""
    #     content_type = models.ForeignKey(ContentType, blank=True, null=True, verbose_name="类型")
    #     object_id = models.PositiveIntegerField(blank=True, null=True)
    #     content_object = GenericForeignKey('content_type', 'object_id')
    #
    #     p_node = models.ForeignKey("self", blank=True, null=True, verbose_name="父级评论")
    #     content = models.TextField(max_length=1024)
    #     account = models.ForeignKey("Account", verbose_name="会员名")
    #     disagree_number = models.IntegerField(default=0, verbose_name="踩")
    #     agree_number = models.IntegerField(default=0, verbose_name="赞同数")
    #     date = models.DateTimeField(auto_now_add=True)
    #
    #     def __str__(self):
    #         return self.content
    #
    #     class Meta:
    #         verbose_name_plural = "19. 通用评论表"
    
    class Account(models.Model):
        username = models.CharField("用户名", max_length=64, unique=True)
        password = models.CharField("密码", max_length=64)
    
    
    class UserAuthToken(models.Model):
        """
        用户Token表
        """
        user = models.OneToOneField(to="Account", on_delete=models.CASCADE)
        token = models.CharField(max_length=64, unique=True)
    
    #
    # # ########################### 优惠券 ################################
    # class Coupon(models.Model):
    #     """优惠券生成规则"""
    #     name = models.CharField(max_length=64, verbose_name="活动名称")
    #     brief = models.TextField(blank=True, null=True, verbose_name="优惠券介绍")
    #     coupon_type_choices = ((0, '通用券'), (1, '满减券'), (2, '折扣券'))
    #     coupon_type = models.SmallIntegerField(choices=coupon_type_choices, default=0, verbose_name="券类型")
    #
    #     """
    #     通用:
    #         money_equivalent_value=100
    #         off_percent=null
    #         minimum_consume=0
    #     满减:
    #         money_equivalent_value=100
    #         off_percent=null
    #         minimum_consume=1000
    #     折扣:
    #         money_equivalent_value=0
    #         off_percent=79
    #         minimum_consume=0
    #     """
    #     money_equivalent_value = models.IntegerField(verbose_name="等值货币")
    #     off_percent = models.PositiveSmallIntegerField("折扣百分比", help_text="只针对折扣券,例7.9折,写79", blank=True, null=True)
    #     minimum_consume = models.PositiveIntegerField("最低消费", default=0, help_text="仅在满减券时填写此字段")
    #
    #     content_type = models.ForeignKey(ContentType, blank=True, null=True)
    #     object_id = models.PositiveIntegerField("绑定课程", blank=True, null=True, help_text="可以把优惠券跟课程绑定")
    #     content_object = GenericForeignKey('content_type', 'object_id')
    #
    #     quantity = models.PositiveIntegerField("数量(张)", default=1)
    #     open_date = models.DateField("优惠券领取开始时间")
    #     close_date = models.DateField("优惠券领取结束时间")
    #     valid_begin_date = models.DateField(verbose_name="有效期开始时间", blank=True, null=True)
    #     valid_end_date = models.DateField(verbose_name="有效结束时间", blank=True, null=True)
    #     coupon_valid_days = models.PositiveIntegerField(verbose_name="优惠券有效期(天)", blank=True, null=True,
    #                                                     help_text="自券被领时开始算起")
    #     date = models.DateTimeField(auto_now_add=True)
    #
    #     class Meta:
    #         verbose_name_plural = "31. 优惠券生成记录"
    #
    #     def __str__(self):
    #         # 得到票的显示方式
    #         return "%s(%s)" % (self.get_coupon_type_display(), self.name)
    #
    # # 为了保存前的时候主动报错
    #     def save(self, *args, **kwargs):
    #         # 如果 优惠券有效期(天) 或者 有效期开始时间 和 有效结束时间
    #         if not self.coupon_valid_days or (self.valid_begin_date and self.valid_end_date):
    #                     # 有效期开始时间 和 有效结束时间
    #             if self.valid_begin_date and self.valid_end_date:
    #                     # 有效结束时间 小于或者等于 有效期开始时间
    #                 if self.valid_end_date <= self.valid_begin_date:
    #                     raise ValueError("valid_end_date 有效期结束日期必须晚于 valid_begin_date ")
    #
    #                 # 优惠券有效期(天)
    #             if self.coupon_valid_days == 0:
    #                 raise ValueError("coupon_valid_days 有效期不能为0")
    #
    #             # 优惠券领取结束时间 小于 优惠券领取开始时间
    #         if self.close_date < self.open_date:
    #             raise ValueError("close_date 优惠券领取结束时间必须晚于 open_date优惠券领取开始时间 ")
    #         # 重写 super 的save方法
    #         super(Coupon, self).save(*args, **kwargs)
    #
    #
    # class CouponRecord(models.Model):
    #     """优惠券发放、消费纪录"""
    #     coupon = models.ForeignKey("Coupon")
    #     number = models.CharField(max_length=64, unique=True)
    #     account = models.ForeignKey("Account", verbose_name="拥有者")
    #     status_choices = ((0, '未使用'), (1, '已使用'), (2, '已过期'))
    #     status = models.SmallIntegerField(choices=status_choices, default=0)
    #     get_time = models.DateTimeField(verbose_name="领取时间", help_text="用户领取时间")
    #     used_time = models.DateTimeField(blank=True, null=True, verbose_name="使用时间")
    #     # order = models.ForeignKey("Order", blank=True, null=True, verbose_name="关联订单")  # 一个订单可以有多个优惠券
    #
    #     class Meta:
    #         verbose_name_plural = "32. 用户优惠券"
    #
    #     def __str__(self):
    #         return '%s-%s-%s' % (self.account, self.number, self.status)

    from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelationfrom django.contrib.contenttypes.models import ContentTypefrom django.db.models import Qfrom django.utils.safestring import mark_safefrom django.db import modelsimport hashlib

    #class CourseCategory(models.Model):    """课程大类, e.g 前端  后端..."""    name = models.CharField(max_length=64, unique=True)
        def __str__(self):        return "%s" % self.name
        class Meta:        verbose_name_plural = "01.课程大类"

    class CourseSubCategory(models.Model):    """课程子类, e.g python linux """    category = models.ForeignKey("CourseCategory", on_delete=models.CASCADE)    name = models.CharField(max_length=64, unique=True)
        def __str__(self):        return "%s" % self.name
        class Meta:        verbose_name_plural = "02.课程子类"

    class DegreeCourse(models.Model):    """学位课程"""    name = models.CharField(max_length=128, unique=True)    course_img = models.CharField(max_length=255, verbose_name="缩略图")    brief = models.TextField(verbose_name="学位课程简介", )    total_scholarship = models.PositiveIntegerField(verbose_name="总奖学金(贝里)", default=40000)    mentor_compensation_bonus = models.PositiveIntegerField(verbose_name="本课程的导师辅导费用(贝里)", default=15000)    period = models.PositiveIntegerField(verbose_name="建议学习周期(days)", default=150)  # 为了计算学位奖学金    prerequisite = models.TextField(verbose_name="课程先修要求", max_length=1024)    teachers = models.ManyToManyField("Teacher", verbose_name="课程讲师")
        # 用于GenericForeignKey反向查询, 不会生成表字段,切勿删除    # coupon = GenericRelation("Coupon")
        # 用于GenericForeignKey反向查询,不会生成表字段,切勿删除    degreecourse_price_policy = GenericRelation("PricePolicy")
        # 查询常见问题    asked_question = GenericRelation("OftenAskedQuestion")
        def __str__(self):        return self.name
        class Meta:        verbose_name_plural = "03.学位课"

    #class Teacher(models.Model):    """讲师、导师表"""    name = models.CharField(max_length=32)    role_choices = ((0, '讲师'), (1, '导师'))    role = models.SmallIntegerField(choices=role_choices, default=0)    title = models.CharField(max_length=64, verbose_name="职位、职称")    signature = models.CharField(max_length=255, help_text="导师签名", blank=True, null=True)    image = models.CharField(max_length=128)    brief = models.TextField(max_length=1024)
        def __str__(self):        return self.name
        class Meta:        verbose_name_plural = "04.导师或讲师"

    class Scholarship(models.Model):    """学位课程奖学金"""    degree_course = models.ForeignKey("DegreeCourse", on_delete=models.CASCADE)    time_percent = models.PositiveSmallIntegerField(verbose_name="奖励档位(时间百分比)", help_text="只填百分值,如80,代表80%")    value = models.PositiveIntegerField(verbose_name="奖学金数额")
        def __str__(self):        return "%s:%s" % (self.degree_course, self.value)
        class Meta:        verbose_name_plural = "05.学位课奖学金"

    class Course(models.Model):    """专题课程 OR 学位课模块"""    name = models.CharField(max_length=128, unique=True)  # Python基础    course_img = models.CharField(max_length=255)
        sub_category = models.ForeignKey("CourseSubCategory", on_delete=models.CASCADE)  #
        course_type_choices = ((0, '付费'), (1, 'VIP专享'), (2, '学位课程'))    course_type = models.SmallIntegerField(choices=course_type_choices)
        degree_course = models.ForeignKey("DegreeCourse", blank=True, null=True, help_text="若是学位课程,此处关联学位表",                                      on_delete=models.CASCADE)
        brief = models.TextField(verbose_name="课程(模块)概述", max_length=2048)    level_choices = ((0, '初级'), (1, '中级'), (2, '高级'))    level = models.SmallIntegerField(choices=level_choices, default=1)    pub_date = models.DateField(verbose_name="发布日期", blank=True, null=True)    period = models.PositiveIntegerField(verbose_name="建议学习周期(days)", default=7)    order = models.IntegerField("课程顺序", help_text="从上一个课程数字往后排")    attachment_path = models.CharField(max_length=128, verbose_name="课件路径", blank=True, null=True)    status_choices = ((0, '上线'), (1, '下线'), (2, '预上线'))    status = models.SmallIntegerField(choices=status_choices, default=0)    template_id = models.SmallIntegerField("前端模板id", default=1)
        # 如果是专题课时,获取相关优惠券    # coupon = GenericRelation("Coupon")
        # 用于GenericForeignKey反向查询,不会生成表字段,切勿删除    price_policy = GenericRelation("PricePolicy")
        # 查询常见问题    asked_question = GenericRelation("OftenAskedQuestion")
        def __str__(self):        return "%s(%s)" % (self.name, self.get_course_type_display())
        class Meta:        verbose_name_plural = "06.专题课或学位课模块"

    class CourseDetail(models.Model):    """课程详情页内容"""    course = models.OneToOneField("Course", on_delete=models.CASCADE)
        hours = models.IntegerField("课时")    course_slogan = models.CharField(max_length=125, blank=True, null=True)    video_brief_link = models.CharField(verbose_name='课程介绍', max_length=255, blank=True, null=True)    why_study = models.TextField(verbose_name="为什么学习这门课程")    what_to_study_brief = models.TextField(verbose_name="我将学到哪些内容")    career_improvement = models.TextField(verbose_name="此项目如何有助于我的职业生涯")    prerequisite = models.TextField(verbose_name="课程先修要求", max_length=1024)    recommend_courses = models.ManyToManyField("Course", related_name="recommend_by", blank=True)    teachers = models.ManyToManyField("Teacher", verbose_name="课程讲师")
        def __str__(self):        return "%s" % self.course
        class Meta:        verbose_name_plural = "07.课程或学位模块详细"

    ##class OftenAskedQuestion(models.Model):    """常见问题"""    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)  # 关联course or degree_course    object_id = models.PositiveIntegerField()    content_object = GenericForeignKey('content_type', 'object_id')
        question = models.CharField(max_length=255)    answer = models.TextField(max_length=1024)
        def __str__(self):        return "%s-%s" % (self.content_object, self.question)
        class Meta:        unique_together = ('content_type', 'object_id', 'question')        verbose_name_plural = "08. 常见问题"

    class CourseOutline(models.Model):    """课程大纲"""    course_detail = models.ForeignKey("CourseDetail", on_delete=models.CASCADE)
        # 前端显示顺序    order = models.PositiveSmallIntegerField(default=1)
        title = models.CharField(max_length=128)    content = models.TextField("内容", max_length=2048)
        def __str__(self):        return "%s" % self.title
        class Meta:        unique_together = ('course_detail', 'title')        verbose_name_plural = "09. 课程大纲"

    class CourseChapter(models.Model):    """课程章节"""    course = models.ForeignKey("Course", related_name='coursechapters', on_delete=models.CASCADE)    chapter = models.SmallIntegerField(verbose_name="第几章", default=1)    name = models.CharField(max_length=128)    summary = models.TextField(verbose_name="章节介绍", blank=True, null=True)    pub_date = models.DateField(verbose_name="发布日期", auto_now_add=True)
        class Meta:        unique_together = ("course", 'chapter')        verbose_name_plural = "10. 课程章节"
        def __str__(self):        return "%s:(第%s章)%s" % (self.course, self.chapter, self.name)

    class CourseSection(models.Model):    """课时目录"""    chapter = models.ForeignKey("CourseChapter", related_name='coursesections', on_delete=models.CASCADE)    name = models.CharField(max_length=128)    order = models.PositiveSmallIntegerField(verbose_name="课时排序", help_text="建议每个课时之间空1至2个值,以备后续插入课时")    section_type_choices = ((0, '文档'), (1, '练习'), (2, '视频'))    section_type = models.SmallIntegerField(default=2, choices=section_type_choices)    # 59EE3275E977AADB9C33DC5901307461    section_link = models.CharField(max_length=255, blank=True, null=True, help_text="若是video,填vid,若是文档,填link")
        video_time = 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("是否可试看", default=False)
        class Meta:        unique_together = ('chapter', 'section_link')        verbose_name_plural = "11. 课时"
        def __str__(self):        return "%s-%s" % (self.chapter, self.name)

    class Homework(models.Model):    chapter = models.ForeignKey("CourseChapter", on_delete=models.CASCADE)    title = models.CharField(max_length=128, verbose_name="作业题目")    order = models.PositiveSmallIntegerField("作业顺序", help_text="同一课程的每个作业之前的order值间隔1-2个数")    homework_type_choices = ((0, '作业'), (1, '模块通关考核'))    homework_type = models.SmallIntegerField(choices=homework_type_choices, default=0)    requirement = models.TextField(max_length=1024, verbose_name="作业需求")    threshold = models.TextField(max_length=1024, verbose_name="踩分点")    recommend_period = models.PositiveSmallIntegerField("推荐完成周期(天)", default=7)    scholarship_value = models.PositiveSmallIntegerField("为该作业分配的奖学金(贝里)")    note = models.TextField(blank=True, null=True)    enabled = models.BooleanField(default=True, help_text="本作业如果后期不需要了,不想让学员看到,可以设置为False")
        class Meta:        unique_together = ("chapter", "title")        verbose_name_plural = "12. 章节作业"
        def __str__(self):        return "%s - %s" % (self.chapter, self.title)

    ## ## # class CourseReview(models.Model):# #     """课程评价"""# #     enrolled_course = models.OneToOneField("EnrolledCourse")# #     about_teacher = models.FloatField(default=0, verbose_name="讲师讲解是否清晰")# #     about_video = models.FloatField(default=0, verbose_name="内容实用")# #     about_course = models.FloatField(default=0, verbose_name="课程内容通俗易懂")# #     review = models.TextField(max_length=1024, verbose_name="评价")# #     disagree_number = models.IntegerField(default=0, verbose_name="踩")# #     agree_number = models.IntegerField(default=0, verbose_name="赞同数")# #     tags = models.ManyToManyField("Tags", blank=True, verbose_name="标签")# #     date = models.DateTimeField(auto_now_add=True, verbose_name="评价日期")# #     is_recommend = models.BooleanField("热评推荐", default=False)# #     hide = models.BooleanField("不在前端页面显示此条评价", default=False)# ## #     def __str__(self):# #         return "%s-%s" % (self.enrolled_course.course, self.review)# ## #     class Meta:# #         verbose_name_plural = "13. 课程评价(购买课程后才能评价)"# ## ## # class DegreeCourseReview(models.Model):# #     """学位课程评价# #     为了以后可以定制单独的评价内容,所以不与普通课程的评价混在一起,单独建表# #     """# #     enrolled_course = models.ForeignKey("EnrolledDegreeCourse")# #     course = models.ForeignKey("Course", verbose_name="评价学位模块", blank=True, null=True,# #                                help_text="不填写即代表评价整个学位课程", limit_choices_to={'course_type': 2})# #     about_teacher = models.FloatField(default=0, verbose_name="讲师讲解是否清晰")# #     about_video = models.FloatField(default=0, verbose_name="视频质量")# #     about_course = models.FloatField(default=0, verbose_name="课程")# #     review = models.TextField(max_length=1024, verbose_name="评价")# #     disagree_number = models.IntegerField(default=0, verbose_name="踩")# #     agree_number = models.IntegerField(default=0, verbose_name="赞同数")# #     tags = models.ManyToManyField("Tags", blank=True, verbose_name="标签")# #     date = models.DateTimeField(auto_now_add=True, verbose_name="评价日期")# #     is_recommend = models.BooleanField("热评推荐", default=False)# #     hide = models.BooleanField("不在前端页面显示此条评价", default=False)# ## #     def __str__(self):# #         return "%s-%s" % (self.enrolled_course, self.review)# ## #     class Meta:# #         verbose_name_plural = "14. 学位课评价(购买课程后才能评价)"# ##class PricePolicy(models.Model):    """价格与有课程效期表"""    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)  # 关联course or degree_course    object_id = models.PositiveIntegerField()    content_object = GenericForeignKey('content_type', 'object_id')
        # course = models.ForeignKey("Course")    valid_period_choices = ((1, '1天'), (3, '3天'),                            (7, '1周'), (14, '2周'),                            (30, '1个月'),                            (60, '2个月'),                            (90, '3个月'),                            (180, '6个月'), (210, '12个月'),                            (540, '18个月'), (720, '24个月'),                            )    valid_period = models.SmallIntegerField(choices=valid_period_choices)    price = models.FloatField()
        class Meta:        unique_together = ("content_type", 'object_id', "valid_period")        verbose_name_plural = "15. 价格策略"
        def __str__(self):        return "%s(%s)%s" % (self.content_object, self.get_valid_period_display(), self.price)

    ## # #############深科技############################################# class ArticleSource(models.Model):#     """文章来源"""#     name = models.CharField(max_length=64, unique=True)##     class Meta:#         verbose_name_plural = "16. 文章来源"##     def __str__(self):#         return self.name## class Article(models.Model):#     """文章资讯"""#     title = models.CharField(max_length=255, unique=True, db_index=True, verbose_name="标题")#     source = models.ForeignKey("ArticleSource", verbose_name="来源")#     article_type_choices = ((0, '资讯'), (1, '视频'))#     article_type = models.SmallIntegerField(choices=article_type_choices, default=0)#     brief = models.TextField(max_length=512, verbose_name="摘要")#     head_img = models.CharField(max_length=255)#     content = models.TextField(verbose_name="文章正文")#     pub_date = models.DateTimeField(verbose_name="上架日期")#     offline_date = models.DateTimeField(verbose_name="下架日期")#     status_choices = ((0, '在线'), (1, '下线'))#     status = models.SmallIntegerField(choices=status_choices, default=0, verbose_name="状态")#     order = models.SmallIntegerField(default=0, verbose_name="权重", help_text="文章想置顶,可以把数字调大,不要超过1000")#     vid = models.CharField(max_length=128, verbose_name="视频VID", help_text="文章类型是视频, 则需要添加视频VID", blank=True, null=True)#     comment_num = models.SmallIntegerField(default=0, verbose_name="评论数")#     agree_num = models.SmallIntegerField(default=0, verbose_name="点赞数")#     view_num = models.SmallIntegerField(default=0, verbose_name="观看数")#     collect_num = models.SmallIntegerField(default=0, verbose_name="收藏数")##     # tags = models.ManyToManyField("Tags", blank=True, verbose_name="标签")#     date = models.DateTimeField(auto_now_add=True, verbose_name="创建日期")##     position_choices = ((0, '信息流'), (1, 'banner大图'), (2, 'banner小图'))#     position = models.SmallIntegerField(choices=position_choices, default=0, verbose_name="位置")###     #comment = GenericRelation("Comment")##     class Meta:#         verbose_name_plural = "17. 文章"##     def __str__(self):#         return "%s-%s" % (self.source, self.title)## class Collection(models.Model):#     """收藏"""#     content_type = models.ForeignKey(ContentType)#     object_id = models.PositiveIntegerField()#     content_object = GenericForeignKey('content_type', 'object_id')##     account = models.ForeignKey("Account")#     date = models.DateTimeField(auto_now_add=True)##     class Meta:#         unique_together = ('content_type', 'object_id', 'account')#         verbose_name_plural = "18. 通用收藏表"## class Comment(models.Model):#     """通用的评论表"""#     content_type = models.ForeignKey(ContentType, blank=True, null=True, verbose_name="类型")#     object_id = models.PositiveIntegerField(blank=True, null=True)#     content_object = GenericForeignKey('content_type', 'object_id')##     p_node = models.ForeignKey("self", blank=True, null=True, verbose_name="父级评论")#     content = models.TextField(max_length=1024)#     account = models.ForeignKey("Account", verbose_name="会员名")#     disagree_number = models.IntegerField(default=0, verbose_name="踩")#     agree_number = models.IntegerField(default=0, verbose_name="赞同数")#     date = models.DateTimeField(auto_now_add=True)##     def __str__(self):#         return self.content##     class Meta:#         verbose_name_plural = "19. 通用评论表"
    class Account(models.Model):    username = models.CharField("用户名", max_length=64, unique=True)    password = models.CharField("密码", max_length=64)

    class UserAuthToken(models.Model):    """    用户Token表    """    user = models.OneToOneField(to="Account", on_delete=models.CASCADE)    token = models.CharField(max_length=64, unique=True)
    ## # ########################### 优惠券 ################################# class Coupon(models.Model):#     """优惠券生成规则"""#     name = models.CharField(max_length=64, verbose_name="活动名称")#     brief = models.TextField(blank=True, null=True, verbose_name="优惠券介绍")#     coupon_type_choices = ((0, '通用券'), (1, '满减券'), (2, '折扣券'))#     coupon_type = models.SmallIntegerField(choices=coupon_type_choices, default=0, verbose_name="券类型")##     """#     通用:#         money_equivalent_value=100#         off_percent=null#         minimum_consume=0#     满减:#         money_equivalent_value=100#         off_percent=null#         minimum_consume=1000#     折扣:#         money_equivalent_value=0#         off_percent=79#         minimum_consume=0#     """#     money_equivalent_value = models.IntegerField(verbose_name="等值货币")#     off_percent = models.PositiveSmallIntegerField("折扣百分比", help_text="只针对折扣券,例7.9折,写79", blank=True, null=True)#     minimum_consume = models.PositiveIntegerField("最低消费", default=0, help_text="仅在满减券时填写此字段")##     content_type = models.ForeignKey(ContentType, blank=True, null=True)#     object_id = models.PositiveIntegerField("绑定课程", blank=True, null=True, help_text="可以把优惠券跟课程绑定")#     content_object = GenericForeignKey('content_type', 'object_id')##     quantity = models.PositiveIntegerField("数量(张)", default=1)#     open_date = models.DateField("优惠券领取开始时间")#     close_date = models.DateField("优惠券领取结束时间")#     valid_begin_date = models.DateField(verbose_name="有效期开始时间", blank=True, null=True)#     valid_end_date = models.DateField(verbose_name="有效结束时间", blank=True, null=True)#     coupon_valid_days = models.PositiveIntegerField(verbose_name="优惠券有效期(天)", blank=True, null=True,#                                                     help_text="自券被领时开始算起")#     date = models.DateTimeField(auto_now_add=True)##     class Meta:#         verbose_name_plural = "31. 优惠券生成记录"##     def __str__(self):#         # 得到票的显示方式#         return "%s(%s)" % (self.get_coupon_type_display(), self.name)## # 为了保存前的时候主动报错#     def save(self, *args, **kwargs):#         # 如果 优惠券有效期(天) 或者 有效期开始时间 和 有效结束时间#         if not self.coupon_valid_days or (self.valid_begin_date and self.valid_end_date):#                     # 有效期开始时间 和 有效结束时间#             if self.valid_begin_date and self.valid_end_date:#                     # 有效结束时间 小于或者等于 有效期开始时间#                 if self.valid_end_date <= self.valid_begin_date:#                     raise ValueError("valid_end_date 有效期结束日期必须晚于 valid_begin_date ")##                 # 优惠券有效期(天)#             if self.coupon_valid_days == 0:#                 raise ValueError("coupon_valid_days 有效期不能为0")##             # 优惠券领取结束时间 小于 优惠券领取开始时间#         if self.close_date < self.open_date:#             raise ValueError("close_date 优惠券领取结束时间必须晚于 open_date优惠券领取开始时间 ")#         # 重写 super 的save方法#         super(Coupon, self).save(*args, **kwargs)### class CouponRecord(models.Model):#     """优惠券发放、消费纪录"""#     coupon = models.ForeignKey("Coupon")#     number = models.CharField(max_length=64, unique=True)#     account = models.ForeignKey("Account", verbose_name="拥有者")#     status_choices = ((0, '未使用'), (1, '已使用'), (2, '已过期'))#     status = models.SmallIntegerField(choices=status_choices, default=0)#     get_time = models.DateTimeField(verbose_name="领取时间", help_text="用户领取时间")#     used_time = models.DateTimeField(blank=True, null=True, verbose_name="使用时间")#     # order = models.ForeignKey("Order", blank=True, null=True, verbose_name="关联订单")  # 一个订单可以有多个优惠券##     class Meta:#         verbose_name_plural = "32. 用户优惠券"##     def __str__(self):#         return '%s-%s-%s' % (self.account, self.number, self.status)

  • 相关阅读:
    全网最贴心webpack系列教程和配套代码
    webpack4 系列教程(十五):开发模式与webpack-dev-server
    CSS元素显示模式
    CSS符合选择器
    Emmet语法
    CSS引入方式
    CSS文本属性
    CSS字体属性
    CSS语法规范一
    案例
  • 原文地址:https://www.cnblogs.com/Rivend/p/12602322.html
Copyright © 2011-2022 走看看