Django多表查询练习题
生活随笔
收集整理的這篇文章主要介紹了
Django多表查询练习题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#一 model表:
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.tnameclass Meta:db_table ="teacher"class Grade(models.Model):gid=models.AutoField(primary_key=True)gname=models.CharField(max_length=32)def __str__(self):return self.gnameclass Meta:db_table ="grade"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.knameclass Meta:db_table ="klass"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.snameclass Meta:db_table ="student"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.cnameclass Meta:db_table = "course"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:db_table ="score"# class Meta:# unique_together = (("student","course"),)
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.tnameclass Meta:db_table ="teacher"class Grade(models.Model):gid=models.AutoField(primary_key=True)gname=models.CharField(max_length=32)def __str__(self):return self.gnameclass Meta:db_table ="grade"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.knameclass Meta:db_table ="klass"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.snameclass Meta:db_table ="student"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.cnameclass Meta:db_table = "course"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:db_table ="score"# class Meta:# unique_together = (("student","course"),)
二.ER圖
三.查詢練習題
from django.shortcuts import render,HttpResponse# Create your views here. from django.db.models import Count,Avg,Min,Max,F,Q from .models import * def query(request):''' 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,最高分,最低分;'''#2、 查詢學生總人數;# select count(*) from studentres = Student.objects.all().aggregate(c=Count("sid"))print("res",res) # res {'c': 3}# #3、 查詢“生物”課程和“物理”課程成績都及格的學生id和姓名;(course表,score表,student表)# queryset = Student.objects.filter(score__course__cname="生物").filter(score__score__gt=60).values("sid","sname","score__score").distinct()# queryset2 = Student.objects.filter(score__course__cname="物理").filter(score__score__gt=60).values("sid","sname","score__score").distinct()queryset3=Score.objects.filter(score__gt=60).filter(course__cname="生物").values('student__sname','student__sid',"score","course__cname")queryset4=Score.objects.filter(score__gt=60).filter(course__cname="物理").values('student__sname','student__sid',"score","course__cname")# lst1 = [{'student__sname': '喬丹', 'student__sid': 1, 'score': 67, 'course__cname': '生物'}]# lst2 = [{'student__sname': '喬丹', 'student__sid': 1, 'score': 77, 'course__cname': '物理'},# {'student__sname': '艾弗森', 'student__sid': 2, 'score': 88, 'course__cname': '物理'}] li1 = []for dic in queryset3:li1.append({dic["student__sname"]: dic["student__sid"]})li2 = []for dic2 in queryset4:li2.append({dic["student__sname"]: dic["student__sid"]})li3 = []for name in li1:if name in li2:li3.append(name)print(li3)queryset5 = Score.objects.filter(score__gte=60,course__cname__in=["生物","物理"]).values('student__sname','student__sid',"score","course__cname") #老師的,不對# print("queryset",queryset)# print("queryset2",queryset2)# print("queryset3",queryset3)# print("queryset4",queryset4)print("queryset5",queryset5)print()#4、 查詢每個年級的班級數,取出班級數最多的前三個年級;q1 =Grade.objects.all().annotate(c=Count("klass")).values("gname","c").order_by('-c')[0:3]print("q1",q1)#5、 查詢平均成績最高的學生的id和姓名以及平均成績;q5 =Student.objects.annotate(avg_score=Avg("score__score")).values('sname','avg_score').order_by("-avg_score")[0]print("q5",q5)#6、 查詢每個年級的學生人數;q6= Grade.objects.annotate(c=Count("klass__student")).values("gname","c")print(q6)#7、 查詢每位學生的學號,姓名,平均成績;# q7 =Student.objects.annotate(avg_score=Avg("score__socre")).values("sid","sname","avg_score") #錯誤的寫法q7 =Student.objects.values("sid", "sname").annotate(avg_score=Avg("score__score"))print("q7",q7)#8、 查詢學生編號為“2”的學生的姓名、該學生成績最高的課程名及分數;# q8 =Student.objects.filter(sid=2).first().score_set.all().order_by("-score")[0] # 自己的思路?q8 = Student.objects.filter(sid=2).order_by("-score__score").values("sname","score__score","score__course__cname")[0]print("q8",q8)#9查詢每一個姓“李”的老師所帶班級數q9=Teacher.objects.filter(tname__startswith="李").annotate(c=Count("classes")).values("tname","c")print(q9)#10、查詢班級數小于5的年級id和年級名;q10=Grade.objects.annotate(c=Count("klass")).filter(c__lt=5).values("gid","gname")print(q10)#11、查詢教過課程超過2門的老師的id和姓名;q11=Teacher.objects.annotate(c=Count("course")).filter(c__gt=2).values("tname","tid","c")print("q11",q11)#12、查詢學過編號“1”課程和編號“2”課程的同學的學號、姓名;# q12=Student.objects.filter( Q(score__course__cid=1)&Q(score__course__cid=2)).values("sid","sname") # 自己想的,?ret = Student.objects.filter(score__course__cid=1).filter(score__course__cid=2).values("pk", "sname")# print("q12",q12)print(ret)#13、查詢所帶班級數最多的老師id和姓名;q13=Teacher.objects.annotate(c=Count("classes")).order_by('-c').values("tname","tid","c")[0]print(q13)# 14 查詢有課程成績小于60分的同學的學號、姓名;q14 =Student.objects.filter(score__score__lt=60).values("sid","sname","score__score").distinct()print(q14)#15、查詢男生、女生的人數,按倒序排列; ?# q15_1 = Student.objects.filter(gender=0).count()# q15_2=Student.objects.filter(gender=1).count()# print("男",q15_1)# print("女",q15_2)q15 = Student.objects.values("gender").annotate(c=Count(1)).order_by("-c") #???print(q15)#16、查詢各個課程及相應的選修人數;q16 = Course.objects.annotate(c=Count("score__student__id")).values("cname","c") #可以ret = Score.objects.values("course").annotate(c=Count(1)).values("course__cname", "c") # ???print("ret",ret)print("q16",q16)#17、查詢同時選修了物理課和生物課的學生id和姓名;q17=Student.objects.filter(score__course__cname="物理").filter(score__course__cname="生物").values("sid","sname")print("q17",q17)ret = Student.objects.filter(score__course__cname__in=["物理", "生物"]).values("pk", "sname").distinct()#??? in 不是同時滿足吧print("ret",ret)#18、檢索“3”課程分數小于60,按分數降序排列的同學學號;q18=Course.objects.filter(cid=3).filter(score__score__lt=60).order_by("-score__score").values("score__student_id","score__student__sname")ret=Score.objects.filter(course_id=3, score__lt=60).order_by("-score").values("student_id")print("q18",q18)print(ret)#19、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列;q19=Course.objects.annotate(avg_score=Avg("score__score")).order_by("avg_score").order_by("-cid").values("cname","avg_score")#錯誤,不能分開排序q19=Course.objects.annotate(avg_score=Avg("score__score")).order_by("avg_score","-cid").values("cname","avg_score")# 正確print("q19",q19)ret = Score.objects.values("course").annotate(avg_score=Avg("score")).order_by("avg_score", "-course")# 正確print(ret)#20、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分;q20=Course.objects.annotate(M_score=Max("score__score"),m_score=Min("score__score")).values("cid","M_score","m_score")print(q20)return HttpResponse("OK")?
轉載于:https://www.cnblogs.com/knighterrant/p/10388977.html
總結
以上是生活随笔為你收集整理的Django多表查询练习题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: express与express-art-
- 下一篇: 队列的链式存储结构及实现