表关系图

models.py

from django.db import models

# Create your models here.

class Teacher(models.Model):
tid=models.AutoField(primary_key=True)
tname=models.CharField(max_length=32)
classes=models.ManyToManyField("Klass")
def __str__(self):
return self.tname class Grade(models.Model):
gid=models.AutoField(primary_key=True)
gname=models.CharField(max_length=32) def __str__(self):
return self.gname class Klass(models.Model):
kid=models.AutoField(primary_key=True)
kname=models.CharField(max_length=32)
grade=models.ForeignKey("Grade",on_delete=models.CASCADE)
def __str__(self):
return self.kname class Student(models.Model):
sid=models.AutoField(primary_key=True)
sname=models.CharField(max_length=32)
gender=models.IntegerField(choices=((0,"男"),(1,"女")))
cls=models.ForeignKey("Klass",on_delete=models.CASCADE)
def __str__(self):
return self.sname class Course(models.Model):
cid=models.AutoField(primary_key=True)
cname=models.CharField(max_length=32)
teacher=models.ForeignKey("Teacher",on_delete=models.CASCADE)
def __str__(self):
return self.cname class Score(models.Model):
sid=models.AutoField(primary_key=True)
student=models.ForeignKey("Student",on_delete=models.CASCADE)
course=models.ForeignKey("Course",on_delete=models.CASCADE)
score=models.IntegerField() def __str__(self):
return str(self.student)+str(self.course)+str(self.score) # class Meta:
# unique_together = (("student","course"),)

测试题目:

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

答案:

# # 1 查询学生总人数;
# ret1=Student.objects.count()
# print(ret1)
# # 2 查询生物课程或物理课程成绩都及格的学生id和姓名;
# ret2=Score.objects.filter(course__cname__in=["生物","物理"],score__gte=60).values("student__sname","student__pk")
# ret2=Score.objects.filter(course__cname__in=["生物","物理"],score__gte=60).values("student__pk").annotate(c=Count("course")).filter(c=2) # 3 查询每个年级的班级数,取出班级数最多的前三个年级名称;
# ret=Grade.objects.annotate(c=Count("klass")).order_by("-c")[0:3]
# print(ret) #
# # 4 查询平均成绩最高的学生的id和姓名以及平均成绩; # ret=Score.objects.values("student").annotate(avg_score=Avg("score")).order_by("-avg_score").values("student__sname","student__pk","avg_score")[0]
# print(ret) # # 5 查询每个年级的学生人数;
# ret=Grade.objects.annotate(c=Count("klass__student__pk")).values("gname","c")
# print(ret) # # 6 查询每位学生的学号,姓名,平均成绩;
ret=Student.objects.values("sid","sname").annotate(avg_score=Avg("score__score"))
print(ret)
#ret=Student.objects.annotate(avg_score=Avg("score__score")).values("sid","sname","avg_score") # ret=Student.objects.annotate(avg_score=Avg("score__score")).values("sname","pk","avg_score")
# print(ret) # 7 查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名及分数;
ret=Student.objects.filter(pk=2).order_by("-score__score").values("sname","score__course__cname","score__score")[0]
print(ret)
ret=Score.objects.filter(student__pk=2).order_by("-score").values("student__sname","course__cname","score")[0]
print(ret) # ret=Score.objects.values("student").annotate(max_score=Max("score")).values("student__sname","max_score","course__cname")
# ret = Score.objects.filter(student=2).order_by("-score").values("score", "course__cname", "student__sname")[0]
# print(ret) # 8 查询每一个姓“李”的老师所带班级数;
ret=Teacher.objects.filter(tname__istartswith="小").annotate(c=Count("classes")).values("tname","c")
print(ret) # ret=Teacher.objects.filter(tname__startswith="李").annotate(c=Count("classes")).values("tname","c") # # 9 查询班级数小于5的年级id和年级名;
Grade.objects.annotate(c=Count("klass")).filter(c__lt=5).values("pk","gname") # ret=Grade.objects.annotate(c=Count("klass")).filter(c__lt=5).values("pk","gname") # #10 查询教过课程超过2门的老师的id和姓名; ret=Teacher.objects.annotate(c=Count("course")).filter(c__gt=2).values("pk","tname") # ret=Teacher.objects.annotate(c=Count("course")).filter(c__gt=2).values("pk","tname") # # 11 查询学过编号“1”课程和编号“2”课程的同学的学号、姓名; ret=Student.objects.filter(score__course__cid=1).filter(score__course__cid=2).values("pk","sname")
print(ret) # ret=Student.objects.filter(score__course__cid__in=[1,2]).values("pk","sname")
# # # 12 查询所带班级数最多的老师id和姓名;
ret=Teacher.objects.annotate(c=Count("classes")).order_by("-c").values("pk","tname")[0]
# ret=Teacher.objects.annotate(c=Count("classes")).order_by("-c").values("pk","tname")[0] # # 13 查询有课程成绩小于60分的同学的学号、姓名; ret=Score.objects.filter(score__lt=60).values("student__sname","student__pk").distinct()
print(ret)
# ret=Score.objects.filter(score__lt=60).values("student__sname","student__pk").distinct()
# # # 14 查询男生、女生的人数,按倒序排列;
ret=Student.objects.values("gender").annotate(c=Count(1)).order_by("-c")
# ret=Student.objects.values("gender").annotate(c=Count(1)).order_by("c").values("gender","c") # # 15 查询各个课程及相应的选修人数;
ret=Score.objects.values("course").annotate(c=Count(1)).values("course__cname","c")
print(ret)
# ret=Score.objects.values("course").annotate(c=Count("student")).values("course__cname","c") # # 16 查询同时选修了物理课和生物课的学生id和姓名;
# ret=Student.objects.filter(score__course__cname__in=["物理","生物"]).values("pk","sname") # # 17 检索“3”课程分数小于60,按分数降序排列的同学学号; Score.objects.filter(course_id=3,score__lt=60).order_by("-score").values("student_id")
# ret=Score.objects.filter(course__cid=3,score__lt=60).order_by("score").values("student__sname","student__pk")
#
# # 18 查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列; ret=Score.objects.values("course_id").annotate(c=Avg("score")).order_by("c","-course_id")
# ret=Score.objects.values("course").annotate(avg_score=Avg("score")).order_by("avg_score","course")
#
# # 19 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
ret=Course.objects.annotate(max_score=Max("score__score"),min_score=Min("score__score")).values("pk","max_score","min_score")
# 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. check cve

    今天想检查一下 Gitlab 11.9.0 产品受哪些 cve 的影响.其实网上已经有很多网站可以查询产品的相关 cve,但就是粒度比较粗.我想在 cve 列表中筛选出特定的版本,已经特定的版本,比如 ...

  2. 关于一个function abc() 内 return一个值, 或者多个值写法

    1.想return一个值,选第一种写法 function abc(){ a = '我是adad' return a } console.log(abc) // ==> 这个是错的,不要这样写,经 ...

  3. python程序超时处理 timeout_decorator

    如下两个例子,实现对某个函数的超时处理(其实就是加了一个装饰器timeout): 成功例子: 代码: import time import timeout_decorator @timeout_dec ...

  4. python编码环境安装与基本语法

    一.pycharm的基本使用 1.python以及pycharm的安装 python的版本选择:3.x版本就行 pycharm的版本选择:社区版就够用 pycharm只是一个编写工具,python才是 ...

  5. Linux20期学习笔记 Day2

    Linux系统进程状态及部分基础命令

  6. SSH整合——登录模块

    1.导包——参照我的GitHub Hibernate hibernate/lib/required hibernate/lib/jpa 数据库驱动 Struts2 struts-blank.war/W ...

  7. Mac 升级python2.7 到 3.5

      Mac 系统 OSX 10.12 以上 第1步:下载Python3.5 下载地址如下: Python3.5 第二步:安装python 3.50 点击下载好的pkg文件进行安装,安装完成之后,pyt ...

  8. 2018 ACM-ICPC 区域赛(青岛站)题解整理

    题目链接 C - Flippy Sequence(组合数学+分类讨论) 两区间异或一下,分段考虑,如果全为0则任选两相同区间,答案为$C_{n+1}^{2}=\frac{n(n+1)}{2}$,只有一 ...

  9. oracle基本语句(第七章、数据库逻辑对象管理)

    索引.实体化视图.簇.散列簇.序列.同义词 1.创建表 CREATE TABLE <表名>(<列名1> <数据类型>,……); CREATE GLOBAL TEMP ...

  10. 最全的WEB前端开发程序员学习清单

    史上最全的WEB前端开发程序员学习清单! 今天为什么要给大家分享这篇文章呢,我发现最近来学前端的特别多,群里面整天都有人问:前端好找工作吗?前端要怎么学啊?前端工资怎么样?前端XX,前端XXX,虽然我 ...