ORM多表查询

创建表结构:

from django.db import models
# 创建表结构
# Create your models here. class Class_grade(models.Model):
"""年级表"""
gid = models.AutoField(primary_key=True)
gname = models.CharField(max_length=32) class Teacher(models.Model):
"""老师表"""
tid = models.AutoField(primary_key=True)
tname = models.CharField(max_length=32) class Classtb(models.Model):
"""班级表"""
cid = models.AutoField(primary_key=True)
caption = models.CharField(max_length=32)
grade = models.ForeignKey(to="Class_grade", on_delete=models.CASCADE)
# 多对多
teachers = models.ManyToManyField(to="Teacher") class Student(models.Model):
"""学生表"""
sid = models.AutoField(primary_key=True)
sname = models.CharField(max_length=32)
gender = models.CharField(max_length=32)
classtb = models.ForeignKey(to="Classtb",on_delete=models.CASCADE) class Course(models.Model):
"""课程表"""
cname = models.CharField(max_length=32)
teacher = models.ForeignKey(to="Teacher",on_delete=models.CASCADE) class Score(models.Model):
"""成绩表"""
student = models.ForeignKey(to="Student",on_delete=models.CASCADE)
course = models.ForeignKey(to="Course",on_delete=models.CASCADE)
score = models.IntegerField() #整数

添加数据:

def addclass(request):
Student.objects.create(sname="乔丹",gender="女",classtb_id=1)
Student.objects.create(sname="艾弗森",gender="女",classtb_id=1)
Student.objects.create(sname="科比",gender="男",classtb_id=2)
Student.objects.create(sname="清风徐来",gender="男",classtb_id=3)
Course.objects.create(cname="生物",teacher_id=1)
Course.objects.create(cname="体育",teacher_id=1)
Course.objects.create(cname="物理",teacher_id=2)
c1=Classtb.objects.create(caption="一年一班",grade_id=1)
c2=Classtb.objects.create(caption="二年一班",grade_id=2)
c3=Classtb.objects.create(caption="三年二班",grade_id=3)
Score.objects.create(student_id=1,course_id=1,score=60)
Score.objects.create(student_id=1,course_id=2,score=59)
Score.objects.create(student_id=2,course_id=2,score=99)
#多对多添加表记录
c1.teachers.add(*[1, 2])
c2.teachers.add(*[1, 3])
c3.teachers.add(2)
return HttpResponse("ok")

多表查询练习:

from django.shortcuts import render,redirect,HttpResponse
from django.urls import reverse
from app01.models import Class_grade,Teacher,Classtb,Student,Course,Score
from django.db.models import Avg, Max, Sum, Min, Count,Q,F # orm表的查询练习
def check(request):
"""多表查询练习""" # 2、查询学生总人数;Count
print(Student.objects.all().aggregate(students_c=Count(1))) #{'students_c': 5}
print(Student.objects.count()) # # 3、查询“生物”课程和“物理”课程成绩都及格的学生id和姓名;
print(Score.objects.filter(Q(course__cname='生物')|Q(course__cname='物理'),score__gte=60).values("student_id","student__sname").annotate(c_course=Count("course__cname")).filter(c_course=2))
# < QuerySet[{'student_id': 1, 'student__sname': '乔丹', 'c_course': 2}] > # 4、查询每个年级的班级数,取出班级数最多的前三个年级;
print(Classtb.objects.values("grade__pk").annotate(c=Count(1)).order_by("-c").values("grade__gname","c")[0:3])
# """<QuerySet [{'grade__gname': '二年级', 'c': 3}, {'grade__gname': '三年级', 'c': 2}, {'grade__gname': '一年级', 'c': 2}]>""" # 5、查询平均成绩最高的学生的id和姓名以及平均成绩;
print(Score.objects.values('student__sid',"student__sname").annotate(a=Avg("score")).order_by("a").last())
# {'student_id': 2, 'student__sname': '艾弗森', 'a': 82.0} # 6、查询每个年级的学生人数;
print(Classtb.objects.values("grade__gname").annotate(c_students=Count("student__sid")))
# < QuerySet[{'grade__gname': '一年级', 'c_students': 3}, {'grade__gname': '二年级', 'c_students': 1}, {'grade__gname': '三年级','c_students': 1}] > # 7、查询每位学生的学号,姓名, 平均成绩;
print(Score.objects.values("student_id","student__sname").annotate(avg=Avg("score"))) # 8、查询学生编号为“2”的学生的姓名、该学生成绩最高的课程名及分数;
print(Score.objects.filter(student_id=2).values("student__sname","course__cname","score").order_by("score").last())
# {'student__sname': '艾弗森', 'course__cname': '体育', 'score': 99} # 9、查询姓“李”的老师的个数和所带班级数;
tname_li = Teacher.objects.filter(tname__startswith='李')
print(tname_li.count()) # 姓李的老师个数1
print(tname_li.values('tname', 'classtb__pk').count()) # 其所带班级数3 # 10、查询班级数小于3的年级id和年级名;
print(Class_grade.objects.values("gname").annotate(class_c=Count("classtb__pk")).filter(class_c__lt=3).values("gid",'gname'))

# 11、查询教过课程超过2门的老师的id和姓名;
print(Course.objects.values("teacher__tname").annotate(course_c=Count("cname")).filter(course_c__gt=2).values('teacher__tid','teacher__tname'))
# <QuerySet []> # 12、查询学过编号“1”课程和编号“2”课程的同学的学号、姓名;
print(Score.objects.filter(Q(course__id=1)|Q(course__id=2)).values("student__sid").annotate(course_c=Count("course")).values("student__sid","student__sname").filter(course_c=2))
# < QuerySet[{'student__sid': 5, 'student__sname': '清风徐来'}] > # 13、查询所带班级数最多的老师id和姓名;
print(Classtb.objects.values("teachers__tid","teachers__tname").annotate(class_c=Count("cid")).order_by("class_c").last())
## < QuerySet['teachers__tid': 2, 'teachers__tname': '李四','class_c': 3}]>
## {
# 14、查询有课程成绩小于60分的同学的学号、姓名;
print(Score.objects.filter(score__lt=60).values("student__sid","student__sname").distinct()) #从返回结果中剔除重复记录distinct()
# < QuerySet[{'student__sid': 4, 'student__sname': '大仙'}, {'student__sid': 5, 'student__sname': '清风徐来'}] > # 15、查询男生、女生的人数,按倒序排列;
print(Student.objects.values("gender").annotate(students_c=Count(1)).order_by("-students_c"))
# <QuerySet [{'gender': '女', 'students_c': 3}, {'gender': '男', 'students_c': 2}]> # 16、 查询各个课程及相应的选修人数;
print(Score.objects.values("course__cname").annotate(students_c=Count("student__pk"))) # 17、 查询同时选修了物理课和生物课的学生id和姓名;
print(Score.objects.filter(Q(course__cname="物理")|Q(course__cname="生物")).values("student__sid","student__sname").annotate(course_c=Count("course_id")).filter(course_c=2)) # 18、 检索“3”课程分数小于60,按分数降序排列的同学学号;
print(Score.objects.filter(course_id=3,score__lt=60).order_by("-score").values("student__sid")) # 19、 查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
print(Score.objects.values("course_id").annotate(avg=Avg("score")).order_by("avg","-course_id")) # 20、 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
print(Score.objects.values("course_id").annotate(max_s=Max("score"),min_s=Min("score")))
return HttpResponse("查询成功")

DjangoORM执行原生SQL

# Django执行原生SQL
from django.db import connection def seleck(request):
cursor = connection.cursor()
cursor.execute('select * from app01_teacher')
raw = cursor.fetchone() # 返回结果行游标直读向前,读取一条
raw2 = cursor.fetchall() # 从游标位置起,读取所有
print(raw) # (1, '张三')
print(raw2) # ((2, '李四'), (3, '王二'), (4, '刘六'), (5, '麻子'))
return HttpResponse('查询成功')

  

Django ORM多表查询练习的更多相关文章

  1. django ORM 连表查询2

    set() 更新model对象的关联对象 book_obj=models.Book.objects.first() book_obj.authors.set([2,3]) 把book_obj这个对象重 ...

  2. Django ORM多表查询

    基于双下划线查询 根据存的时候,字段的数据格式衍生的查询方法 1.年龄大于35岁 res = models.AuthorDetails.objects.filter(age__lt=80) print ...

  3. django ORM 连表查询

    db_index=True  如果设置该字段就可以设置索引 auto_now_add  代表设置创建时候的时间 auto_now   每次更新数据记录时会更新该字段 to_field 设置要关联表的字 ...

  4. Django ORM单表查询必会13条

    必知必会13条 操作下面的操作之前,我们实现创建好了数据表,这里主要演示下面的操作,不再细讲创建准备过程 <1> all(): 查询所有结果 <2> filter(**kwar ...

  5. django orm跨表查询废话最少最精简版

    在model.py中: class B1(models.Model): u1= models.CharField(max_length=32) #多 class B2(models.Model): f ...

  6. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

  7. 第五章、Django之多表查询进阶与事务

    目录 第五章.Django之多表查询 一.聚合查询 二.分组查询 三.F与Q查询 四.查询优化 五.Django开启事务 六.自定义char字段 七.ORM常用字段 第五章.Django之多表查询 一 ...

  8. 第十七篇 ORM跨表查询和分组查询---二次剖析

    ORM跨表查询和分组查询---二次剖析 阅读目录(Content) 创建表(建立模型) 基于对象的跨表查询 一对多查询(Publish与Book) 多对多查询 (Author 与 Book) 一对一查 ...

  9. ORM单表查询,跨表查询,分组查询

    ORM单表查询,跨表查询,分组查询   单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models ...

随机推荐

  1. oracle,mysql,SqlServer三种数据库的分页查询

    MySql: MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如 ...

  2. Jquery实现下拉tab切换

    //需求:分别点击html,css,js元素时展示对应的列表内容,其他列表内容要自动收起来 //代码如下 <!DOCTYPE html> <html lang="en&qu ...

  3. java 加法变乘法

    加法变乘法 我们都知道:1+2+3+ - + 49 = 1225 (1) 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+...+10*11+12+...+27*28 ...

  4. 刷题21. Merge Two Sorted Lists

    一.题目说明 这个题目是21. Merge Two Sorted Lists,归并2个已排序的列表.难度是Easy! 二.我的解答 既然是简单的题目,应该一次搞定.确实1次就搞定了,但是性能太差: R ...

  5. Day6 - K - 陌上花开 HYSBZ - 3262

    有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美丽,当且仅Sa>= ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-signal

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-stop

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  8. ELK之 elasticsearch ES集群 head安装

    最近项目用到 jenkins  ELK  也在一次重新学习了一次  jenkins 不用说了 玩得就是  插件   +  base---shell ,  ELK  这几年最流得log收集平台,当然不止 ...

  9. P 1008 说反话

    转跳点:

  10. GNS3 模拟icmp目标不可达

    目标不可达: R1 : conf t int f0/0 no shutdown ip add 192.168.1.1 255.255.255.0 end R2 f0/0: conf t int f0/ ...