django orm 常用操作
阿新 • • 發佈:2018-11-29
# -*- 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')