Django学生信息管理系统(6)学生成绩添加和学生成绩查询(多对对关系)

一、简述

这个部分可以算是这个系统的难点部分了,主要涉及到了对多对多表格关系之间的操作

由于在前面我使用的是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}))

Django学生信息管理系统(6)学生成绩添加和学生成绩查询(多对对关系)_第1张图片

没有进行过多的页面渲染,这个页面是先通过选择班级,再跳转进入的,目前只有第一个学生进行了选课的操作,如图所示。

三、查询方法

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})

Django学生信息管理系统(6)学生成绩添加和学生成绩查询(多对对关系)_第2张图片

查询方法是先找到对应id所有的stucourses, 通过单个stucourse.course的方法可以直接找到所对应的course对象,从而达到相识课程名的效果。到此,这个学生信息管理系统也就基本完成了。但是由于项目中,遇到的某些事,中间暂停了一段时间,最终的效果其实并没有完全达到我之前想要达到的效果。

目前未完成的功能:管理员登录功能、用户登录验证功能

这两个功能,我将在下一篇介绍MiddleWare中间件的时候,一起实现。

你可能感兴趣的:(学习笔记)