作业详解

作业详解

53.ORM作业讲解-准备工作

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

54.ORM作业讲解(1)

55.ORM作业讲解(2)

56.ORM作业讲解(3)

ORM作业参考答案:

  1. 查询平均成绩大于60分的同学的id和平均成绩;
rows = Student.objects.annotate(avg=Avg("score__number")).filter(avg__gte=60).values("id","avg")
for row in rows:
	print(row)
  1. 查询所有同学的id、姓名、选课的数、总成绩;
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)
  1. 查询姓“李”的老师的个数;
teacher_nums = Teacher.objects.filter(name__startswith="李").count()
print(teacher_nums)
  1. 查询没学过“黄老师”课的同学的id、姓名;
rows = Student.objects.exclude(score__course__teacher__name="黄老师").values('id','name')
for row in rows:
	print(row)
  1. 查询学过课程id为1和2的所有同学的id、姓名;
rows = Student.objects.filter(score__course__in=[1,2]).distinct().values('id','name')
for row in rows:
	print(row)
  1. 查询学过“黄老师”所教的所有课的同学的学号、姓名;
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)
  1. 查询所有课程成绩小于60分的同学的id和姓名;
students = Student.objects.exclude(score__number__gt=60)
for student in students:
	print(student)
  1. 查询没有学全所有课的同学的id、姓名;
students = Student.objects.annotate(num=Count(F("score__course"))).filter(num__lt=Course.objects.count()).values('id','name')
for student in students:
	print(student)
  1. 查询所有学生的姓名、平均分,并且按照平均分从高到低排序;
students = Student.objects.annotate(avg=Avg("score__number")).order_by("-avg").values('name','avg')
for student in students:
	print(student)
  1. 查询各科成绩的最高和最低分,以如下形式显示:课程ID,课程名称,最高分,最低分:
courses = Course.objects.annotate(min=Min("score__number"),max=Max("score__number")).values("id",'name','min','max')
for course in courses:
	print(course)
  1. 查询每门课程的平均成绩,按照平均成绩进行排序;
courses = Course.objects.annotate(avg=Avg("score__number")).order_by('avg').values('id','name','avg')
for course in courses:
	print(course)
  1. 统计总共有多少女生,多少男生;
rows =Student.objects.aggregate(male_num=Count("gender",filter=Q(gender=1)),female_num=Count("gender",filter=Q(gender=2)))
	print(rows)
  1. 将“黄老师”的每一门课程都在原来的基础之上加5分;
rows = Score.objects.filter(course__teacher__name='黄老师').update(number=F("number")+5)
	print(rows)
  1. 查询两门以上不及格的同学的id、姓名、以及不及格课程数;
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)
  1. 查询每门课的选课人数;
courses = Course.objects.annotate(student_nums=Count("score__student")).values('id','name','student_nums')
for course in courses:
	print(course)

57.ORM迁移详解-migrations命令补充

migrations中的迁移版本和数据库中的迁移版本对不上怎么
办?

  1. 找到哪里不一致,然后使用 python manage.py --fake [版本名字] ,将这个版本标记为已经映射。

  2. 删除指定 app 下 migrations 和数据库表 django_migrations 中和这个 app 相关的版本号,然后将模型中的字段和数据库中的字段保持一致,再使用命令 python manage.py makemigrations 重新生成一个初始化的迁移脚本,之后再使用命令 python manage.py makemigrations --fake-initial 来将这个初始化的迁移脚本标记为已经映射。以后再修改就没有问题了。

更多关于迁移脚本的。请查看官方文档:https://docs.djangoproject.com/en/2.0/topics/migrations/

58.ORM迁移详解-migrate命令报错解决方案

59.根据已有的表生成ORM模型详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值