版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37049050/article/details/82721981
# -*- coding: utf-8 -*-
from django.db import models
import sys
from django.db.models import Avg, Sum, Q
reload(sys)
sys.setdefaultencoding('utf8')
# Create your models here.
from django.db import models
class Student(models.Model):
"""学生表"""
name = models.CharField(max_length=100)
class Meta:
db_table = 'student'
def __str__(self):
return self.name
class Teacher(models.Model):
"""老师表"""
name = models.CharField(max_length=100)
class Meta:
db_table = 'teacher'
def __str__(self):
return self.name
class Course(models.Model):
"""课程表"""
name = models.CharField(max_length=100)
teacher = models.ForeignKey(Teacher, on_delete=models.SET_NULL, null=True, blank=True, related_name="courses")
cours = models.ManyToManyField(Student,blank=True,null=True)
class Meta:
db_table = 'course'
def __str__(self):
return self.name
class Score(models.Model):
"""分数表"""
student = models.ForeignKey(Student, on_delete=models.SET_NULL, null=True, blank=True, related_name="students")
course = models.ForeignKey(Course, on_delete=models.SET_NULL, null=True, blank=True, related_name="courses")
number = models.IntegerField()
class Meta:
db_table = 'score'
def __str__(self):
try:
return self.student.name
except:
return "delete"
models文件如上,可能设计的有点不合理,凑活着做个例子。
1.查询平均成绩大于60分的同学的id和平均成绩:
Student.objects.annotate(num=Avg('students__number')).filter(num__gt=60).values('num','name')
2.查询每节课选课的人数:
Course.objects.annotate(num=Count('cours')).values("name","num")
3.查询姓李的老师:
Teacher.objects.filter(name__startswith="李")
<QuerySet [<Teacher: 李老师>, <Teacher: 李老四>]>
4.查询没有学过李老师的课的学生:
Student.objects.exclude(course__teacher__name='李老师')
5.求出上过语文课和数学课的学生:
Student.objects.filter(course__name__in=["语文课","数学课"]).distinct()
6.筛选出学习科目少于4种的学生:
Student.objects.annotate(num=Count(F('course'))).filter(num__lt=4).values('num','name')
7.求学生平均分数并按从高到低排序:
Student.objects.annotate(avg=Avg('students__number')).order_by('-avg').values('avg','name')
8.对上李老师的课程的学生加 5 分:
Score.objects.filter(course__teacher__name="李老师").update(number=F('number')+5)
9.每门课选课人数:
Course.objects.annotate(num=Count('cours')).values('num','name')