Django 小实例S1 简易学生选课管理系统 第9节——创建课程模型(model)

点击查看教程总目录

作者自我介绍:b站小UP主时常直播编程+红警三python1对1辅导老师

对于课程模块,需要:

  • 课程表
  • 学生课程表:学生和课程的关系表
  • 时刻表:课程上课时间设置

由于课程会有多个状态,这个可以先在constants.py中去记录好(即添加代码如下)

  1. COURSE_STATUS = {
  2. 1: "未开始选课",
  3. 2: "开始选课",
  4. 3: "结束选课",
  5. 4: "结课",
  6. 5: "打分完成",
  7. }
  8. COURSE_OPERATION = {
  9. 1: "开始选课",
  10. 2: "结束选课",
  11. 3: "结课",
  12. 4: "给分",
  13. 5: "查看详情"
  14. }

然后在course/models.py中导入下面会需要的所有库

  1. from django.db import models
  2. import datetime
  3. from user.models import Student, Teacher
  4. from constants import COURSE_STATUS, COURSE_OPERATION

1 添加课程模型

course/models.py中添加代码如下

  1. def current_year():
  2. # refer: https://stackoverflow.com/questions/49051017/year-field-in-django/49051348
  3. return datetime.date.today().year
  4. class Course(models.Model):
  5. credits = [
  6. (1, 1),
  7. (2, 2),
  8. (3, 3),
  9. (4, 4),
  10. (5, 5),
  11. ]
  12. semesters = [
  13. ("Autumn", "上"),
  14. ("Spring", "下")
  15. ]
  16. name = models.CharField(max_length=50, verbose_name="课程名")
  17. introduction = models.CharField(max_length=250, verbose_name="介绍")
  18. credit = models.IntegerField(verbose_name="学分")
  19. max_number = models.IntegerField(verbose_name="课程最大人数")
  20. year = models.IntegerField(verbose_name="年份", default=current_year)
  21. semester = models.CharField(max_length=20, verbose_name="学期", choices=semesters)
  22. # 未开始选课, 1
  23. # 开始选课,未结束选课 2
  24. # 结束选课, 3
  25. # 结课 4
  26. # 已打完分 5
  27. status = models.IntegerField(verbose_name="课程状态", default=1)
  28. teacher = models.ForeignKey(Teacher, verbose_name="课程教师", on_delete=models.CASCADE)
  29. def get_status_text(self):
  30. return COURSE_STATUS[self.status]
  31. def get_op_text(self):
  32. return COURSE_OPERATION[self.status]
  33. def get_current_count(self):
  34. courses = StudentCourse.objects.filter(course=self, with_draw=False)
  35. return len(courses)
  36. def get_schedules(self):
  37. schedules = Schedule.objects.filter(course=self)
  38. return schedules
  39. def __str__(self):
  40. return "%s (%s)" % (self.name, self.teacher.name)

补充说明: get_status_textget_op_text方法是为了方便在模板中调用。

2 添加课程时刻表模型

course/models.py中添加代码如下

  1. def weekday_choices():
  2. weekday_str = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  3. return [(i+1, weekday_str[i]) for i in range(7)]
  4. class Schedule(models.Model):
  5. weekday = models.IntegerField(choices=weekday_choices(), verbose_name="日期")
  6. start_time = models.TimeField(verbose_name="上课时间")
  7. end_time = models.TimeField(verbose_name="下课时间")
  8. location = models.CharField(max_length=100, verbose_name="上课地点")
  9. remarks = models.CharField(max_length=100, verbose_name="备注", null=True, blank = True)
  10. start_week = models.IntegerField(verbose_name="第几周开始")
  11. end_week = models.IntegerField(verbose_name="第几周结束")
  12. intervals = [
  13. (1, "无间隔"),
  14. (2, "每隔一周上一次")
  15. ]
  16. week_interval = models.IntegerField(verbose_name="周间隔", choices=intervals, default=1)
  17. course = models.ForeignKey(Course, verbose_name="课程名", on_delete=models.CASCADE)
  18. def __str__(self):
  19. s = "第%s周-第%s周 " % (self.start_week, self.end_week)
  20. if self.week_interval == 2:
  21. s += "隔一周 "
  22. s += "%s %s-%s " % (self.get_weekday_display(), self.start_time.strftime("%H:%M"),
  23. self.end_time.strftime("%H:%M"))
  24. s += "在%s" % self.location
  25. if self.remarks:
  26. s += " %s" % self.remarks
  27. return s

3 添加学生课程关系表模型

course/models.py中添加代码如下

  1. class StudentCourse(models.Model):
  2. create_time = models.DateTimeField(auto_now=True)
  3. with_draw = models.BooleanField(default=False)
  4. with_draw_time = models.DateTimeField(default=None, null=True)
  5. scores = models.IntegerField(verbose_name="成绩", null=True)
  6. comments = models.CharField(max_length=250, verbose_name="老师评价", null=True)
  7. rates = [
  8. (1, 1),
  9. (2, 2),
  10. (3, 3),
  11. (4, 4),
  12. (5, 5),
  13. ]
  14. rating = models.IntegerField(verbose_name="学生评分", choices=rates, null=True, help_text="5分为最满意,最低分是1分")
  15. assessment = models.CharField(max_length=250, verbose_name="学生评价", null=True)
  16. student = models.ForeignKey(Student, on_delete=models.CASCADE)
  17. course = models.ForeignKey(Course, on_delete=models.CASCADE)

4 建立(更新)数据库

第三节第三部分

简单复述一遍,即在项目文件夹下打开命令行窗口,执行:

  1. python manage.py makemigrations
  2. python manage.py migrate

Django 小实例S1 简易学生选课管理系统 9 创建课程模型(model)的更多相关文章

  1. Django 小实例S1 简易学生选课管理系统 3 创建用户模型(model)

    Django 小实例S1 简易学生选课管理系统 第3节--创建用户模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 本文涉及到的新 ...

  2. Django 小实例S1 简易学生选课管理系统 10 老师课程业务实现

    Django 小实例S1 简易学生选课管理系统 第10节--老师课程业务实现 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块中,老师将要使 ...

  3. Django 小实例S1 简易学生选课管理系统 12 CSS样式完善

    Django 小实例S1 简易学生选课管理系统 第12节--CSS样式完善 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块的逻辑代码到这里 ...

  4. Django 小实例S1 简易学生选课管理系统 11 学生课程业务实现

    Django 小实例S1 简易学生选课管理系统 第11节--学生课程业务实现 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块中,学生需要拥 ...

  5. Django 小实例S1 简易学生选课管理系统 8 CSS样式优化

    Django 小实例S1 简易学生选课管理系统 第8节--CSS样式优化 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 前面的几节下来,用户模块基 ...

  6. Django 小实例S1 简易学生选课管理系统 7 修改个人信息

    Django 小实例S1 简易学生选课管理系统 第7节--修改个人信息 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 用户模块除了注册登录之外,还 ...

  7. Django 小实例S1 简易学生选课管理系统 6 实现登录逻辑

    Django 小实例S1 简易学生选课管理系统 第6节--实现登录逻辑 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 业务逻辑 本教程第四节里 ...

  8. Django 小实例S1 简易学生选课管理系统 2 新建项目(project)并进行设置

    Django 小实例S1 简易学生选课管理系统 第2节--新建项目(project)并进行设置 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 0 ...

  9. Django 小实例S1 简易学生选课管理系统 4 实现登录页面

    Django 小实例S1 简易学生选课管理系统 第4节--实现登录页面 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 本文涉及到的新的额外知识点: ...

随机推荐

  1. mqtt网关服务器连接阿里云关联物模型

    mqtt网关服务器连接阿里云关联物模型 卓岚专门为工业环境设计的RS485设备数据采集器/物联网网关,兼具串口服务器.Modbus网关.MQTT网关.RS485转JSON等多种功能于一体. 可以连接阿 ...

  2. selenium--多窗口

    多窗口/句柄 有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了. 1. ...

  3. Python爬虫:通过做项目,小编了解了酷狗音乐的加密过程

    1.前言 小编在这里讲一下,下面的内容仅供学习参考,切莫用于商业活动,一经被相关人员发现,本小编概不负责!读者切记切记. 2.获取音乐播放列表 其实,这就是小编要讲的重点,因为就是这部分用到了加密. ...

  4. Redis的一些常用命令

    查看所有键 keys * 首先先向数据库中插入一些键值对 演示keys *命令 keys *查询所有键的方式是遍历数据库中的键,其时间复杂度为O(n),如果数据库的数量一旦过大,其效率就大大降低,因此 ...

  5. 树莓派3B搭建NODE-RED运行环境并构建数据流

    树莓派3B搭建NODE-RED运行环境并构建数据流 树莓派搭建Node-RED环境 树莓派自2015年开始是默认就带NODE-RED的,但是如今已是2018年:)自带的版本已经很老了,可通过下面的命令 ...

  6. Java秘诀!Java逻辑运算符介绍

    运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的. Java 语言中的运算符除了具有优先级之外,还有结合性的特点.当一个表达式中出现多种运算符时,执行的先后顺序 ...

  7. 解决nodejs的npm命令无反应的问题

    最近在弄cordova,又要折腾nodejs了. 今天安装cordova模块的时候,看到nodejs的默认模块安装路径在c盘 于是想修改下,按命令 npm config set prefix . 结果 ...

  8. 题解 「BZOJ3636」教义问答手册

    题目传送门 Description 作为泉岭精神的缔造者.信奉者.捍卫者.传承者,Pear决定印制一些教义问答手册,以满足泉岭精神日益增多的信徒.Pear收集了一些有关的诗选.语录,其中部分内容摘录在 ...

  9. python jinja2初见

    吸取了长城杯的教训,学习python-web迫在眉睫. 正常难度的python_template_injection,由于现在没学面向对象,理解原理比较困难,所以先使用简单版复现:并附上正常版的常用p ...

  10. 如何将jdk12的源码导入idea

    如何将jdk12的源码导入idea中 一 首先,在idea中新建一个java工程 接着,在本地找到jdk所在的文件目录,进入jdk目录,找到javasrc目录或者一个src.zip的压缩包, 在向下或 ...