094~097:ORM作业准备和讲解

ORM作业准备和讲解:

数据库模型如下:

class Teacher(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        db_table = 'teacher'

class Student(models.Model):
    name = models.CharField(max_length=100)
    gender = models.SmallIntegerField()

    class Meta:
        db_table = 'student'

class Course(models.Model):
    name = models.CharField(max_length=100)
    teacher = models.ForeignKey("Teacher", on_delete=models.SET_NULL, null=True)

    class Meta:
        db_table = 'course'

class Score(models.Model):
    student = models.ForeignKey('Student', on_delete=models.CASCADE)
    course = models.ForeignKey("Course", on_delete=models.CASCADE)
    number = models.FloatField()

    class Meta:
        db_table = 'score'

使用之前学到过的操作实现下面的查询操作:

1、查询平均成绩大于60分的同学的id和平均成绩;

    students = Student.objects.annotate(stu_avg=Avg("score")).filter(stu_avg__gte=60).values("id", "stu_avg")
    for item in students:
        print(item)
    print(students.query)
SELECT `student`.`id`, AVG(`score`.`id`) AS `stu_avg` FROM `student` LEFT OUTER JOIN `score` ON (`student`.`id` = `score`.`student_id`) GROUP BY `student`.`id` HAVING AVG(`score`.`id`) >= 60 ORDER BY NULL

2、查询所有同学的id、姓名、选课的数量、总成绩;

    rows = Student.objects.annotate(course_nums=Count("score__course"), total_score=Sum("score__number")).values("id", "name", "course_nums", "total_score")
    for row in rows:
        print(row)
SELECT `student`.`id`, `student`.`name`, COUNT(`score`.`course_id`) AS `course_nums`, SUM(`score`.`number`) AS `total_score` FROM `student` LEFT OUTER JOIN `score` ON (`student`.`id` = `score`.`student_id`) GROUP BY `student`.`id` ORDER BY NULL

3、查询姓“李”的老师的个数;

    teacher_nums = Teacher.objects.filter(name__startswith="").count()
    print(teacher_nums)

4、查询没学过“李老师”课的同学的id、姓名;

    students = Student.objects.exclude(score__course__teacher__name="李老师").values("id", "name")
    for item in students:
        print(item)

5、查询学过课程id为1和2的所有同学的id、姓名;

    rows = Student.objects.filter(score__course__in=[1, 2]).distinct().values('id', 'name')
    for row in rows:
        print(row)

6、查询学过“黄老师”所教的“所有课”的同学的id、姓名;

    rows = Student.objects.annotate(nums=Count("score__course", filter=Q(score__course__teacher__name = '黄老师'))).filter(nums=Course.objects.filter(teacher__name='黄老师').count()).values('id', 'name')
    for row in rows:
        print(row)

7、查询所有课程成绩小于60分的同学的id和姓名;

8、查询没有学全所有课的同学的id、姓名;
9、查询所有学生的姓名、平均分,并且按照平均分从高到低排序;
10、查询各科成绩的最高和最低分,以如下形式显示:课程ID,课程名称,最高分,最低分;
11、查询没门课程的平均成绩,按照平均成绩进行排序;
12、统计总共有多少女生,多少男生;
13、将“黄老师”的每一门课程都在原来的基础之上加5分;
14、查询两门以上不及格的同学的id、姓名、以及不及格课程数;
15、查询每门课的选课人数;

 

猜你喜欢

转载自www.cnblogs.com/zheng-weimin/p/10311800.html