Django 小實例S1 簡易學生選課管理系統 第9節——創建課程模型(model)
點擊查看教程總目錄
作者自我介紹:b站小UP主,時常直播編程+紅警三,python1對1輔導老師。
對於課程模塊,需要:
- 課程表
- 學生課程表:學生和課程的關系表
- 時刻表:課程上課時間設置
由於課程會有多個狀態,這個可以先在constants.py
中去記錄好(即添加代碼如下)
COURSE_STATUS = {
1: "未開始選課",
2: "開始選課",
3: "結束選課",
4: "結課",
5: "打分完成",
}
COURSE_OPERATION = {
1: "開始選課",
2: "結束選課",
3: "結課",
4: "給分",
5: "查看詳情"
}
然后在course/models.py
中導入下面會需要的所有庫
from django.db import models
import datetime
from user.models import Student, Teacher
from constants import COURSE_STATUS, COURSE_OPERATION
1 添加課程模型
在course/models.py
中添加代碼如下
def current_year():
# refer: https://stackoverflow.com/questions/49051017/year-field-in-django/49051348
return datetime.date.today().year
class Course(models.Model):
credits = [
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
]
semesters = [
("Autumn", "上"),
("Spring", "下")
]
name = models.CharField(max_length=50, verbose_name="課程名")
introduction = models.CharField(max_length=250, verbose_name="介紹")
credit = models.IntegerField(verbose_name="學分")
max_number = models.IntegerField(verbose_name="課程最大人數")
year = models.IntegerField(verbose_name="年份", default=current_year)
semester = models.CharField(max_length=20, verbose_name="學期", choices=semesters)
# 未開始選課, 1
# 開始選課,未結束選課 2
# 結束選課, 3
# 結課 4
# 已打完分 5
status = models.IntegerField(verbose_name="課程狀態", default=1)
teacher = models.ForeignKey(Teacher, verbose_name="課程教師", on_delete=models.CASCADE)
def get_status_text(self):
return COURSE_STATUS[self.status]
def get_op_text(self):
return COURSE_OPERATION[self.status]
def get_current_count(self):
courses = StudentCourse.objects.filter(course=self, with_draw=False)
return len(courses)
def get_schedules(self):
schedules = Schedule.objects.filter(course=self)
return schedules
def __str__(self):
return "%s (%s)" % (self.name, self.teacher.name)
補充說明: get_status_text
和get_op_text
方法是為了方便在模板中調用。
2 添加課程時刻表模型
在course/models.py
中添加代碼如下
def weekday_choices():
weekday_str = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
return [(i+1, weekday_str[i]) for i in range(7)]
class Schedule(models.Model):
weekday = models.IntegerField(choices=weekday_choices(), verbose_name="日期")
start_time = models.TimeField(verbose_name="上課時間")
end_time = models.TimeField(verbose_name="下課時間")
location = models.CharField(max_length=100, verbose_name="上課地點")
remarks = models.CharField(max_length=100, verbose_name="備注", null=True, blank = True)
start_week = models.IntegerField(verbose_name="第幾周開始")
end_week = models.IntegerField(verbose_name="第幾周結束")
intervals = [
(1, "無間隔"),
(2, "每隔一周上一次")
]
week_interval = models.IntegerField(verbose_name="周間隔", choices=intervals, default=1)
course = models.ForeignKey(Course, verbose_name="課程名", on_delete=models.CASCADE)
def __str__(self):
s = "第%s周-第%s周 " % (self.start_week, self.end_week)
if self.week_interval == 2:
s += "隔一周 "
s += "%s %s-%s " % (self.get_weekday_display(), self.start_time.strftime("%H:%M"),
self.end_time.strftime("%H:%M"))
s += "在%s" % self.location
if self.remarks:
s += " %s" % self.remarks
return s
3 添加學生課程關系表模型
在course/models.py
中添加代碼如下
class StudentCourse(models.Model):
create_time = models.DateTimeField(auto_now=True)
with_draw = models.BooleanField(default=False)
with_draw_time = models.DateTimeField(default=None, null=True)
scores = models.IntegerField(verbose_name="成績", null=True)
comments = models.CharField(max_length=250, verbose_name="老師評價", null=True)
rates = [
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
]
rating = models.IntegerField(verbose_name="學生評分", choices=rates, null=True, help_text="5分為最滿意,最低分是1分")
assessment = models.CharField(max_length=250, verbose_name="學生評價", null=True)
student = models.ForeignKey(Student, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
4 建立(更新)數據庫
簡單復述一遍,即在項目文件夾下打開命令行窗口,執行:
python manage.py makemigrations
python manage.py migrate