表关系图

models.py

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Teacher(models.Model):
  6. tid=models.AutoField(primary_key=True)
  7. tname=models.CharField(max_length=32)
  8. classes=models.ManyToManyField("Klass")
  9. def __str__(self):
  10. return self.tname
  11.  
  12. class Grade(models.Model):
  13. gid=models.AutoField(primary_key=True)
  14. gname=models.CharField(max_length=32)
  15.  
  16. def __str__(self):
  17. return self.gname
  18.  
  19. class Klass(models.Model):
  20. kid=models.AutoField(primary_key=True)
  21. kname=models.CharField(max_length=32)
  22. grade=models.ForeignKey("Grade",on_delete=models.CASCADE)
  23. def __str__(self):
  24. return self.kname
  25.  
  26. class Student(models.Model):
  27. sid=models.AutoField(primary_key=True)
  28. sname=models.CharField(max_length=32)
  29. gender=models.IntegerField(choices=((0,"男"),(1,"女")))
  30. cls=models.ForeignKey("Klass",on_delete=models.CASCADE)
  31. def __str__(self):
  32. return self.sname
  33.  
  34. class Course(models.Model):
  35. cid=models.AutoField(primary_key=True)
  36. cname=models.CharField(max_length=32)
  37. teacher=models.ForeignKey("Teacher",on_delete=models.CASCADE)
  38. def __str__(self):
  39. return self.cname
  40.  
  41. class Score(models.Model):
  42. sid=models.AutoField(primary_key=True)
  43. student=models.ForeignKey("Student",on_delete=models.CASCADE)
  44. course=models.ForeignKey("Course",on_delete=models.CASCADE)
  45. score=models.IntegerField()
  46.  
  47. def __str__(self):
  48. return str(self.student)+str(self.course)+str(self.score)
  49.  
  50. # class Meta:
  51. # unique_together = (("student","course"),)

测试题目:

  1. 1 自行创建测试数据;
  2. 2 查询学生总人数;
  3. 3 查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;
  4. 4 查询每个年级的班级数,取出班级数最多的前三个年级;
  5. 5 查询平均成绩最高的学生的id和姓名以及平均成绩;
  6. 6 查询每个年级的学生人数;
  7. 7 查询每位学生的学号,姓名,平均成绩;
  8. 8 查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名及分数;
  9. 9 查询姓“李”的老师的个数和所带班级数;
  10. 10、查询班级数小于5的年级id和年级名;
  11. 11、查询教过课程超过2门的老师的id和姓名;
  12. 12、查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;
  13. 13、查询所带班级数最多的老师id和姓名;
  14. 14、查询有课程成绩小于60分的同学的学号、姓名;
  15. 15、查询男生、女生的人数,按倒序排列;
  16. 16、查询各个课程及相应的选修人数;
  17. 17、查询同时选修了物理课和生物课的学生id和姓名;
  18. 18、检索“3”课程分数小于60,按分数降序排列的同学学号;
  19. 19、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
  20. 20、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

答案:

  1. # # 1 查询学生总人数;
  2. # ret1=Student.objects.count()
  3. # print(ret1)
  4. # # 2 查询生物课程或物理课程成绩都及格的学生id和姓名;
  5. # ret2=Score.objects.filter(course__cname__in=["生物","物理"],score__gte=60).values("student__sname","student__pk")
  6. # ret2=Score.objects.filter(course__cname__in=["生物","物理"],score__gte=60).values("student__pk").annotate(c=Count("course")).filter(c=2)
  7.  
  8. # 3 查询每个年级的班级数,取出班级数最多的前三个年级名称;
  9. # ret=Grade.objects.annotate(c=Count("klass")).order_by("-c")[0:3]
  10. # print(ret)
  11.  
  12. #
  13. # # 4 查询平均成绩最高的学生的id和姓名以及平均成绩;
  14.  
  15. # ret=Score.objects.values("student").annotate(avg_score=Avg("score")).order_by("-avg_score").values("student__sname","student__pk","avg_score")[0]
  16. # print(ret)
  17.  
  18. # # 5 查询每个年级的学生人数;
  19. # ret=Grade.objects.annotate(c=Count("klass__student__pk")).values("gname","c")
  20. # print(ret)
  21.  
  22. # # 6 查询每位学生的学号,姓名,平均成绩;
  23. ret=Student.objects.values("sid","sname").annotate(avg_score=Avg("score__score"))
  24. print(ret)
  25. #ret=Student.objects.annotate(avg_score=Avg("score__score")).values("sid","sname","avg_score")
  26.  
  27. # ret=Student.objects.annotate(avg_score=Avg("score__score")).values("sname","pk","avg_score")
  28. # print(ret)
  29.  
  30. # 7 查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名及分数;
  31. ret=Student.objects.filter(pk=2).order_by("-score__score").values("sname","score__course__cname","score__score")[0]
  32. print(ret)
  33. ret=Score.objects.filter(student__pk=2).order_by("-score").values("student__sname","course__cname","score")[0]
  34. print(ret)
  35.  
  36. # ret=Score.objects.values("student").annotate(max_score=Max("score")).values("student__sname","max_score","course__cname")
  37. # ret = Score.objects.filter(student=2).order_by("-score").values("score", "course__cname", "student__sname")[0]
  38. # print(ret)
  39.  
  40. # 8 查询每一个姓“李”的老师所带班级数;
  41. ret=Teacher.objects.filter(tname__istartswith="小").annotate(c=Count("classes")).values("tname","c")
  42. print(ret)
  43.  
  44. # ret=Teacher.objects.filter(tname__startswith="李").annotate(c=Count("classes")).values("tname","c")
  45.  
  46. # # 9 查询班级数小于5的年级id和年级名;
  47. Grade.objects.annotate(c=Count("klass")).filter(c__lt=5).values("pk","gname")
  48.  
  49. # ret=Grade.objects.annotate(c=Count("klass")).filter(c__lt=5).values("pk","gname")
  50.  
  51. # #10 查询教过课程超过2门的老师的id和姓名;
  52.  
  53. ret=Teacher.objects.annotate(c=Count("course")).filter(c__gt=2).values("pk","tname")
  54.  
  55. # ret=Teacher.objects.annotate(c=Count("course")).filter(c__gt=2).values("pk","tname")
  56.  
  57. # # 11 查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;
  58.  
  59. ret=Student.objects.filter(score__course__cid=1).filter(score__course__cid=2).values("pk","sname")
  60. print(ret)
  61.  
  62. # ret=Student.objects.filter(score__course__cid__in=[1,2]).values("pk","sname")
  63. #
  64.  
  65. # # 12 查询所带班级数最多的老师id和姓名;
  66. ret=Teacher.objects.annotate(c=Count("classes")).order_by("-c").values("pk","tname")[0]
  67. # ret=Teacher.objects.annotate(c=Count("classes")).order_by("-c").values("pk","tname")[0]
  68.  
  69. # # 13 查询有课程成绩小于60分的同学的学号、姓名;
  70.  
  71. ret=Score.objects.filter(score__lt=60).values("student__sname","student__pk").distinct()
  72. print(ret)
  73. # ret=Score.objects.filter(score__lt=60).values("student__sname","student__pk").distinct()
  74. #
  75.  
  76. # # 14 查询男生、女生的人数,按倒序排列;
  77. ret=Student.objects.values("gender").annotate(c=Count(1)).order_by("-c")
  78. # ret=Student.objects.values("gender").annotate(c=Count(1)).order_by("c").values("gender","c")
  79.  
  80. # # 15 查询各个课程及相应的选修人数;
  81. ret=Score.objects.values("course").annotate(c=Count(1)).values("course__cname","c")
  82. print(ret)
  83. # ret=Score.objects.values("course").annotate(c=Count("student")).values("course__cname","c")
  84.  
  85. # # 16 查询同时选修了物理课和生物课的学生id和姓名;
  86. # ret=Student.objects.filter(score__course__cname__in=["物理","生物"]).values("pk","sname")
  87.  
  88. # # 17 检索“3”课程分数小于60,按分数降序排列的同学学号;
  89.  
  90. Score.objects.filter(course_id=3,score__lt=60).order_by("-score").values("student_id")
  91. # ret=Score.objects.filter(course__cid=3,score__lt=60).order_by("score").values("student__sname","student__pk")
  92. #
  93. # # 18 查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
  94.  
  95. ret=Score.objects.values("course_id").annotate(c=Avg("score")).order_by("c","-course_id")
  96. # ret=Score.objects.values("course").annotate(avg_score=Avg("score")).order_by("avg_score","course")
  97. #
  98. # # 19 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
  99. ret=Course.objects.annotate(max_score=Max("score__score"),min_score=Min("score__score")).values("pk","max_score","min_score")
  100. # ret=Course.objects.annotate(max_score=Max("score__score"),min_score=Min("score__score")).values("cname","max_score","min_score")

orm练习题的更多相关文章

  1. orm 练习题

    一: 多表练习查询 1. 自行创建测试数据: 2. 查询学生总人数: 3. 查询“生物”课程和“物理”课程成绩都及格的学生id和姓名: 4. 查询每个年级的班级数,取出班级数最多的前三个年级: 5. ...

  2. Django学习之ORM练习题

    一.表关系 创建表关系,并创建约束 班级表:class 学生表: student cid caption grade_id sid sname gender class_id 1 一年一班 1 1 乔 ...

  3. 9.14.16 Django ORM进阶用法

    2018-9-14 14:26:45 ORM 练习题   : http://www.cnblogs.com/liwenzhou/articles/8337352.html 2018-9-14 21:1 ...

  4. Django orm练习

    ORM练习题 models生成 from django.db import models # Create your models here. # 书籍管理 class Book(models.Mod ...

  5. 03-django模型(1)

    一.内容回顾 1.路由层 a.简单使用 b.有名分组 c.路由分发 d.反向解析 2.视图层 a.HttpRequest对象 常用的属性 常用方法 b.HttpResponse对象 响应三剑客 3.模 ...

  6. day67 ORM模型之高阶用法整理,聚合,分组查询以及F和Q用法,附练习题整理

    归纳总结的笔记: day67 ORM 特殊的语法 一个简单的语法 --翻译成--> SQL语句 语法: 1. 操作数据库表 创建表.删除表.修改表 2. 操作数据库行 增.删.改.查 怎么连数据 ...

  7. Python之路-python(mysql介绍和安装、pymysql、ORM sqlachemy)

    本节内容 1.数据库介绍 2.mysql管理 3.mysql数据类型 4.常用mysql命令 创建数据库 外键 增删改查表 5.事务 6.索引 7.python 操作mysql 8.ORM sqlac ...

  8. python 之路,Day11(上) - python mysql and ORM

    python 之路,Day11 - python mysql and ORM   本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...

  9. Day11 - Mysql and ORM

    python 之路,Day11 - python mysql and ORM   本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...

随机推荐

  1. python 服务器 cpu 监控程序--转

    后台 py 代码 app.py ''' 服务器cpu监控程序 思路:后端后台线程一旦产生数据,即刻推送至前端. 好处:不需要前端ajax定时查询,节省服务器资源. 作者:hhh5460 时间:2017 ...

  2. iOS-NSLog发布时取消打印日志

    1 选择工程的Target -> Build Settings -> Preprocessor Macros. 如图,默认 Debug项,是“DEBUG=1”. 2 在程序中设置全局宏定义 ...

  3. docker inspect命令查看镜像详细信息

    使用 inspect 命令查看镜像详细信息,包括制作者.适应架构.各层的数字摘要等. # docker inspect --help Usage: docker inspect [OPTIONS] N ...

  4. VUE点击颜色选中

  5. 一、Vue CLI

    一.Vue CLI https://cli.vuejs.org/zh/guide/installation.html 介绍: 二.安装 # 安装 Vue Cli npm install -g @vue ...

  6. ARM汇编 汇编文件后缀.s与.S

    有两套汇编的语法: ARM公司的标准ARM汇编语言和GNU对ARM支持的GNU ARM汇编. ARM标准汇编语言即ARM公司的开发工具ADS里用的汇编语言: GNU汇编即在Linux下用GCC编译的汇 ...

  7. 解决:java compiler level does not match the version of the installed java project facet错误

    java compiler level does not match the version of the installed java project facet错误的解决 因工作的关系,Eclip ...

  8. 微信小程序-饮食日志_开发记录03

    这段时间主要是收尾阶段. 美化界面,排版分部等. 并进行上传,审核. 环境部署一直出现问题,所以测试版食物查找查找不到. 主要问题是:https://的网页证书没有通过审核. 所以现在推行开发,调试版 ...

  9. 关于react中context的使用

    context是用于组件间数据的传递,就是减少props的使用 具体使用也很简单 第一步设置默认值,第二部用provider发放,第三步使用contextType来接受最近的provider,然后直接 ...

  10. 用Java 实现断点续传 (HTTP)

    在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...