django orm 常用操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 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')

猜你喜欢

转载自blog.csdn.net/qq_37049050/article/details/82721981