Django學生資訊管理系統(6)學生成績新增和學生成績查詢(多對對關係)

死神的護發表於2018-05-18

一、簡述

這個部分可以算是這個系統的難點部分了,主要涉及到了對多對多表格關係之間的操作

由於在前面我使用的是mangtomany的方式新增的多對多關係,在這個功能中,由於要涉及到分數,而分數和課程已經學生的關係甚至和課程的關係都是一對多,所以分數字段在學生與課程表的中間表,是最符合他們之間的關係。

但是由於使用manytomany的方法,無法直接對中間表進行操作,所以必須要從新定義這個中間表的model。但是這個時候再來從新定義一個相同的中間表會導致更改很多東西。所以為了我再次地應了一個新的中間表(score)

新的score表在每次選擇或者取消課程的同時也進行一次相對應的操作

score表的建立方式, 由於前幾次migrate出現了錯誤,導致我在migrate的時候出現了很多錯誤,所以在這裡我還是直接使用Navicat進行表格的建立

create table score(
    id int not null auto_increment,
    course_id int default null,
    stu_id int default null,
    primary key(id),
    foreign key(course_id) references course(id),
    foreign key(stu_id) references student
)

雖然沒有使用python manage.py makemigrations這些操作,model模型的定義還是不能少

class StuCourse(models.Model):
    student = models.ForeignKey(Student)
    course = models.ForeignKey(Course)
    score = models.IntegerField(null=True, blank=True)

    class Meta:
        db_table = 'scores'

上面需要注意的是blank,null屬性的區別,前者是在表單提交時是否可以為空,後者是資料庫中是否可以為空,如果想要想建立學生id和課程id,再新增score,請一定要加上blank=True。否則後果自負。

二、新增方法:

def sure_scores(request):
    if request.method == 'POST':
        course_id = request.POST.get('course_id')
        stu_id = request.POST.get('stu_id')
        stu = Student.objects.get(pk=stu_id)
        g_id = stu.g_id
        course_id_score = request.POST.get('score_'+course_id)
        stucourse = StuCourse.objects.get(course_id=course_id, student_id=stu_id)
        stucourse.score = int(course_id_score)
        stucourse.save()
        return HttpResponseRedirect(reverse('course:currentgs', kwargs={'g_id': g_id}))

img

沒有進行過多的頁面渲染,這個頁面是先通過選擇班級,再跳轉進入的,目前只有第一個學生進行了選課的操作,如圖所示。

三、查詢方法

def select_scores(request):
    if request.method == 'GET':
        s_name = request.session['s_name']
        stu = Student.objects.get(s_name=s_name)
        stucourses = stu.stucourse_set.all()
        return render(request, 'selscores.html', {'stucourses': stucourses, 'stu': stu})

img

查詢方法是先找到對應id所有的stucourses, 通過單個stucourse.course的方法可以直接找到所對應的course物件,從而達到相識課程名的效果。到此,這個學生資訊管理系統也就基本完成了。但是由於專案中,遇到的某些事,中間暫停了一段時間,最終的效果其實並沒有完全達到我之前想要達到的效果。

目前未完成的功能:管理員登入功能、使用者登入驗證功能

這兩個功能,我將在下一篇介紹MiddleWare中介軟體的時候,一起實現。

相關文章