Django框架_ORM作业

1.ORM作业

  • 假设有以下ORM模型
from django.db import models

# Create your models here.
class Student(models.Model):
    """学生表"""
    name = models.CharField(max_length=100)
    gender = models.SmallIntegerField()

    class Meta:
        db_table = 'student'


class Teacher(models.Model):
    """老师表"""
    name = models.CharField(max_length=100)

    class Meta:
        db_table = 'teacher'


class Courser(models.Model):
    """课程表"""
    name = models.CharField(max_length=100)
    teacher = models.ForeignKey('Teacher', on_delete=models.SET_NULL, null=True)

    class Meta:
        db_table = 'courser'


class Score(models.Model):
    student = models.ForeignKey('Student', on_delete=models.CASCADE)
    courser = models.ForeignKey('Courser', on_delete=models.CASCADE)
    number = models.IntegerField()

    class Meta:
        db_table = 'score'

1.1 作业

使用之前学到过的操作实现下面的查询操作:

1. 查询平均成绩大于60分的同学的id和平均成绩;
2. 查询所有同学的id、姓名、选课的数量、总成绩;
3. 查询姓“李”的老师的个数;
4. 查询没学过“李老师”课的同学的id、姓名;
5. 查询学过课程id为1和2的所有同学的id、姓名;
6. 查询学过“黄老师”所教的“所有课”的同学的id、姓名;
7. 查询所有课程成绩小于60分的同学的id和姓名;
8. 查询没有学全所有课的同学的id、姓名;
9. 查询所有学生的姓名、平均分,并且按照平均分从高到低排序;
10. 查询各科成绩的最高和最低分,以如下形式显示:课程ID,课程名称,最高分,最低分;
11. 查询没门课程的平均成绩,按照平均成绩进行排序;
12. 统计总共有多少女生,多少男生;
13. 将“黄老师”的每一门课程都在原来的基础之上加5分;
14. 查询两门以上不及格的同学的id、姓名、以及不及格课程数;
15. 查询每门课的选课人数;

1.2 作业答案

  • 部分作业答案
from django.shortcuts import render
from front.models import Student, Teacher, Courser, Score
from django.db.models import Avg, Count, Sum, F, Q
from django.db import connection
from django.http import HttpResponse


# Create your views here.
# 1. 查询平均成绩大于60分的同学的id和平均成绩;
def index(request):
    # Student.objects.annotate(score_avg=Avg('score__number')) 求每个人平均值
    # .filter(score_avg__gt=60) 平均值基础上 大于60分
    # .values('id','score_avg') 最后返回学生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)
    #  查看最终返回SQL语句
    sql = connection.queries[-1]
    return HttpResponse('查询平均成绩大于60分的同学的id和平均成绩SQL语句{}'.format(sql))


# 2. 查询所有同学的id、姓名、选课的数量、总成绩;
def index1(request):
    students = Student.objects.annotate(score_count=Count('score__courser'), score_sum=Sum('score__number')).values(
        'id', 'name', 'score_count', 'score_sum')
    for student in students:
        print(student)
        #  查看最终返回SQL语句
    sql = connection.queries[-1]
    return HttpResponse('查询所有同学的id、姓名、选课的数量、总成绩{}'.format(sql))


# 4. 查询没学过“李老师”课的同学的id、姓名;
# score__courser__teacher__name='李老师' 通过分数找到课程,课程找到老师,老师找到李老师
def index2(request):
    student = Student.objects.exclude(score__courser__teacher__name='李老师').values('id', 'name')
    print(student)
    return HttpResponse('查询没学过“李老师”课的同学的id、姓名')


# 6. 查询学过“黄老师”所教的“所有课”的同学的id、姓名;
# 主体:同学
# 第一步:先找到每一位学生学习黄老师课程数量 A
# 第二步:课程表中找到黄老师交得课程数量
# 如果A = B 意味着这个学生学习了黄老师教的所有课程
def index3(request):
    # A 统计 annotate(nums=Count('score__courser',filter=Q(score__courser__teacher__name='黄老师')))
    # B 统计 Courser.objects.filter(teacher__name='黄老师').count()
    students = Student.objects.annotate(
        nums=Count('score__courser', filter=Q(score__courser__teacher__name='黄老师'))).filter(
        nums=Courser.objects.filter(teacher__name='黄老师').count()).values('id', 'name')
    for student in students:
        print(student)
    return HttpResponse('查询学过“黄老师”所教的“所有课”的同学的id、姓名')

1.3 参考答案

1. 查询平均成绩大于60分的同学的id和平均成绩;

   ```python
    rows = Student.objects.annotate(avg=Avg("score__number")).filter(avg__gte=60).values("id","avg")
    for row in rows:
        print(row)
   ```

2. 查询所有同学的id、姓名、选课的数、总成绩;

   ```python
    rows = Student.objects.annotate(course_nums=Count("score__course"),total_score=Sum("score__number"))
    .values("id","name","course_nums","total_score")
    for row in rows:
        print(row)
   ```

3. 查询姓“李”的老师的个数;

   ```python
    teacher_nums = Teacher.objects.filter(name__startswith="李").count()
    print(teacher_nums)
   ```

4. 查询没学过“黄老师”课的同学的id、姓名;

   ```python
    rows = Student.objects.exclude(score__course__teacher__name="黄老师").values('id','name')
    for row in rows:
        print(row)
   ```

5. 查询学过课程id为1和2的所有同学的id、姓名;

   ```python
    rows = Student.objects.filter(score__course__in=[1,2]).distinct().values('id','name')
    for row in rows:
        print(row)
   ```

6. 查询学过“黄老师”所教的所有课的同学的学号、姓名;

   ```python
    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)
   ```

7. 查询所有课程成绩小于60分的同学的id和姓名;

   ```python
    students = Student.objects.exclude(score__number__gt=60)
    for student in students:
        print(student)
   ```

8. 查询没有学全所有课的同学的id、姓名;

   ```python
    students = Student.objects.annotate(num=Count(F("score__course"))).filter(num__lt=Course.objects.count()).values('id','name')
    for student in students:
        print(student)
   ```

9. 查询所有学生的姓名、平均分,并且按照平均分从高到低排序;

   ```python
    students = Student.objects.annotate(avg=Avg("score__number")).order_by("-avg").values('name','avg')
    for student in students:
        print(student)
   ```

10. 查询各科成绩的最高和最低分,以如下形式显示:课程ID,课程名称,最高分,最低分:

    ```python
    courses = Course.objects.annotate(min=Min("score__number"),max=Max("score__number")).values("id",'name','min','max')
    for course in courses:
        print(course)
    ```

11. 查询每门课程的平均成绩,按照平均成绩进行排序;

    ```pyhon
    courses = Course.objects.annotate(avg=Avg("score__number")).order_by('avg').values('id','name','avg')
    for course in courses:
        print(course)
    ```

12. 统计总共有多少女生,多少男生;

    ```python
    rows = Student.objects.aggregate(male_num=Count("gender",filter=Q(gender=1)),female_num=Count("gender",filter=Q(gender=2)))
    print(rows)
    ```

13. 将“黄老师”的每一门课程都在原来的基础之上加5分;

    ```python
    rows = Score.objects.filter(course__teacher__name='黄老师').update(number=F("number")+5)
    print(rows)
    ```

14. 查询两门以上不及格的同学的id、姓名、以及不及格课程数;

    ```python
    students = Student.objects.annotate(bad_count=Count("score__number",filter=Q(score__number__lt=60))).filter(bad_count__gte=2).values('id','name','bad_count')
    for student in students:
        print(student)
    ```

15. 查询每门课的选课人数;

    ```python
    courses = Course.objects.annotate(student_nums=Count("score__student")).values('id','name','student_nums')
    for course in courses:
        print(course)
    ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值