django開發系列:ORM之作業

django開發系列:ORM之作業

模型:

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=100)
    gender = models.SmallIntegerField()

    class Meta:
        db_table = 'student'


class Course(models.Model):
    name = models.CharField(max_length=100)
    teacher = models.ForeignKey("Teacher",on_delete=models.SET_NULL,null=True)
    class Meta:
        db_table = 'course'


class Score(models.Model):
    student = models.ForeignKey("Student",on_delete=models.CASCADE)
    course = models.ForeignKey("Course",on_delete=models.CASCADE)
    number = models.FloatField()

    class Meta:
        db_table = 'score'


class Teacher(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        db_table = 'teacher'

作業:

使用之前學到過的操作實現下面的查詢操作:

1. 查詢平均成績大於60分的同學的id和平均成績;
2. 查詢所有同學的id、姓名、選課的數量、總成績;
3. 查詢姓“李”的老師的個數;
4. 查詢沒學過“李老師”課的同學的id、姓名;
5. 查詢學過課程id12的所有同學的id、姓名;
6. 查詢學過“黃老師”所教的“所有課”的同學的id、姓名; 7. 查詢所有課程成績小於60分的同學的id和姓名;
8. 查詢沒有學全所有課的同學的id、姓名;
9. 查詢所有學生的姓名、平均分,並且按照平均分從高到低排序;
10. 查詢各科成績的最高和最低分,以如下形式顯示:課程ID,課程名稱,最高分,最低分;
11. 查詢沒門課程的平均成績,按照平均成績進行排序; 12. 統計總共有多少女生,多少男生;
13. 將“黃老師”的每一門課程都在原來的基礎之上加5分;
14. 查詢兩門以上不及格的同學的id、姓名、以及不及格課程數;
15. 查詢每門課的選課人數;

查詢代碼:

from django.shortcuts import render
from django.http import HttpResponse
from .models import Student,Teacher,Score,Course
from django.db.models import Avg,Sum,Count,Q,F,Min,Max

def index(request):
    #1. 查詢平均成績大於60分的同學的id和平均成績;
    students = Student.objects.annotate(score_avg = Avg("score__number")).filter(score_avg__gt=60).values('id','score_avg')
    for student in students:
        print(student)
    return HttpResponse('123')

def index2(request):
    #2. 查詢所有同學的id、姓名、選課的數量、總成績;
    students = Student.objects.annotate(course_num = Count('score'),total = Sum('score__number')).values('id','course_num','total','name')
    for student in students:
        print(student)
    return HttpResponse('456')

def index3(request):
    #3.查詢姓“李”的老師的個數;
    count = Teacher.objects.filter(name__startswith='李').count()
    print(count)
    return HttpResponse('789')

def index4(request):
    #4.查詢沒學過“李老師”課的同學的id、姓名;
    students = Student.objects.exclude(score__course__teacher__name = '李老師').values('id','name')
    for student in students:
        print(student)
    return HttpResponse('741')

def index5(request):
    # 5.查詢學過課程id爲1和2的所有同學的id、姓名
    students = Student.objects.filter(score__course__in=[1.2]).values('id','name')
    for student in students:
        print(student)
    return HttpResponse('852')

def index6(request):
    # 6.查詢學過“黃老師”所教的所有課的同學的學號、姓名;
    # 1. 首先先找到每一位學生學習的黃老師課程的數量;A
    # 2. 在課程的表中找到黃老師教的課程的數量;B
    # 3. 判斷A是否等於B,如果相等,那麼意味着這位學生學習了黃老師教的
    # 所有課程,如果不想等,那麼意味着這位學生沒有學完黃老師教的所有課程
    rows = Student.objects.annotate(nums =Count("score__course",filter=Q(score__course__teacher__name='黃老師'))).filter(nums =Course.objects.filter(teacher__name='黃老師').count()).values('id','name')
    for row in rows:
        print(row)
    return HttpResponse('00000')

def index7(request):
    # 7. 查詢所有課程成績小於60分的同學的id和姓名;
    students = Student.objects.filter(score__number__lt=60).values('id','name')
    print(students)
    for student in students:
        print(student)
    return HttpResponse('159')

def index8(request):
    # 8. 查詢沒有學全所有課的同學的id、姓名;
    # students = Student.objects.annotate(num=Count(F('score__course')))
    students = Student.objects.annotate(num = Count(F('score__course'))).filter(num__lt=Course.objects.count()).values('id','name')
    print(students)
    return HttpResponse('index8')

def index9(request):
    # 9.查詢所有學生的姓名、平均分,並且按照平均分從高到低排序;
    students =Student.objects.annotate(avg = Avg('score__course')).order_by('-avg').values('name','avg')
    for student in students:
        print(student)
    return HttpResponse('index9')

def index10(request):
    # 10.查詢各科成績的最高和最低分,以如下形式顯示:課程ID,課程名稱,最高分,最低分:
    courses = Course.objects.annotate(min = Min("score__number"),max=Max("score__number")).values('id','name','min','max')
    for course in courses:
        print(course)
    return HttpResponse("index10")

def index11(request):
    # 11. 查詢每門課程的平均成績,按照平均成績進行排序;
    courses = Course.objects.annotate(avg =Avg("score__number")).order_by("avg").values("id",'name','avg')
    for course in courses:
        print(course)
    return HttpResponse('index11')

def index12(request):
    # 12. 統計總共有多少女生,多少男生
    rows = Student.objects.aggregate(male_num=Count('gender',filter=Q(gender=1)),female_num =Count('gender',filter=Q(gender=2)))
    print(rows)
    return HttpResponse('index12')

def index13(request):
    # 13.將“黃老師”的每一門課程都在原來的基礎之上加5分;
    rows = Score.objects.filter(course__teacher__name='黃老師').update(number=F('number')+5)
    print(rows)
    return HttpResponse('index13')

def index14(request):
    #14 .查詢兩門以上不及格的同學的id、姓名、以及不及格課程數
    students = Student.objects.annotate(bad_num = Count('score__number',filter=Q(score__number__lt=60))).filter(bad_num__gte=2).values('id','name','bad_num')
    for student in students:
        print(student)
    return HttpResponse('index14')

def index15(request):
    #15. 查詢每門課的選課人數;
    courses = Course.objects.annotate(student_num = Count('score__student')).values('name','student_num')
    for course in courses:
        print(course)
    return HttpResponse('index15')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章