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、查询每门课的选课人数;