orm练习题
表关系图


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练习题的更多相关文章
- orm 练习题
一: 多表练习查询 1. 自行创建测试数据: 2. 查询学生总人数: 3. 查询“生物”课程和“物理”课程成绩都及格的学生id和姓名: 4. 查询每个年级的班级数,取出班级数最多的前三个年级: 5. ...
- Django学习之ORM练习题
一.表关系 创建表关系,并创建约束 班级表:class 学生表: student cid caption grade_id sid sname gender class_id 1 一年一班 1 1 乔 ...
- 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 ...
- Django orm练习
ORM练习题 models生成 from django.db import models # Create your models here. # 书籍管理 class Book(models.Mod ...
- 03-django模型(1)
一.内容回顾 1.路由层 a.简单使用 b.有名分组 c.路由分发 d.反向解析 2.视图层 a.HttpRequest对象 常用的属性 常用方法 b.HttpResponse对象 响应三剑客 3.模 ...
- day67 ORM模型之高阶用法整理,聚合,分组查询以及F和Q用法,附练习题整理
归纳总结的笔记: day67 ORM 特殊的语法 一个简单的语法 --翻译成--> SQL语句 语法: 1. 操作数据库表 创建表.删除表.修改表 2. 操作数据库行 增.删.改.查 怎么连数据 ...
- Python之路-python(mysql介绍和安装、pymysql、ORM sqlachemy)
本节内容 1.数据库介绍 2.mysql管理 3.mysql数据类型 4.常用mysql命令 创建数据库 外键 增删改查表 5.事务 6.索引 7.python 操作mysql 8.ORM sqlac ...
- python 之路,Day11(上) - python mysql and ORM
python 之路,Day11 - python mysql and ORM 本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...
- Day11 - Mysql and ORM
python 之路,Day11 - python mysql and ORM 本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...
随机推荐
- Echarts多个图表响应式以及其他问题
1.限制柱状图的宽度(自适应的柱子很大) barMaxWidth:30//设置柱状最大的宽度 2.设置y轴的label标签显示(单位 元 转 万) axisLabel: { formatte ...
- pycharm解释器链接如何pymongo
1.pymongo 链接数据库 # pycharm 链接我们的mogodb # 下载pymongo from pymongo import MongoClient # 客户端请求 服务端 # 链接 c ...
- VMware 问题
桥接模式下,小鸡上不了网问题 多网卡导致的问题 解决:编辑-虚拟网络编辑器 选择vmnet0,然后点击右下角更改设置 把自动改为指定要桥接的网卡,然后点击确定,测试看看.
- Eureka实现高可用及为Eureka设置登录账号和密码
本文通过两个eureka相互注册实现注册中心的高可用,同时为注册中心配置认证登录. 需要用到的maven配置 <dependency> <groupId>org.springf ...
- regsvr32 驱动
1.将SYS驱动文件放到系统目录的SYSTEM32目录中.2.按WIN+R组合键,在运行框中输入:regsvr32 sys所在全路径,点击确定即可.
- 流式布局和viewport
流式布局 百分比布局,非固定宽度,内容向两边填充,流动的布局. viewport(视口) PC端的网页在手机端的浏览器显示是不会出现网页的,这是因为移动端的网页不是直接放在移动端的浏览器中,而是放在移 ...
- redis中如何存储java对象
根据redis的存储原理,Redis的key和value都支持二进制安全的字符串 1.利用序列化和反序列化的方式 存储java对象我们可以通过对象的序列化与反序列化完成存储于取出,这样就可以使用red ...
- ZROI 19.08.01 树上数据结构
1.总览 LCT 链分治(树剖) 点/边分治 2.点分治 一棵树,点有\(0/1\),多次修改,询问最远的两个\(1\)距离. 建出点分树,每个子树用堆维护:①最远的\(1\)距离:②它的每个儿子的① ...
- php 的windows集成开发环境
1.安装视频 https://www.bilibili.com/video/av10274152/?p=5 2.所需的安装包: https://pan.baidu.com/s/1GLnuzkKFIT ...
- Dw 表单制作 与 dedecms 结合实现提交效果
Dw 表单制作 与 dedecms 结合实现提交效果 自定义表单的用处 1.教育类网站的学员报名 2.企业网站的在线订单 3.普通网页上的一些和用户交互的小功能 实现原理:首先添加表单:核心-频道模型 ...