1. 程式人生 > >django orm 常用操作

django orm 常用操作

# -*- 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')