Django再次练习orm语句

Posted guishuzhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django再次练习orm语句相关的知识,希望对你有一定的参考价值。

请配合https://www.cnblogs.com/Guishuzhe/p/9524790.html使用

models.py

from django.db import models


class ClassTable(models.Model):
"""班级"""
id = models.AutoField(primary_key=True)
caption = models.CharField(max_length=32)

def __str__(self):
return self.caption


class Student(models.Model):
"""学生"""
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32, verbose_name="学生名字")
gender_choices = ((1, "男"), (2, "女"))
gender = models.IntegerField(choices=gender_choices, verbose_name="性别")
classb = models.ForeignKey(to="ClassTable", verbose_name="班级")

def __str__(self):
return self.name


class Teacher(models.Model):
"""老师"""
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32, verbose_name="老师名字")
students = models.ManyToManyField(to="Student")
classb = models.ManyToManyField(to="ClassTable")

def __str__(self):
return self.name


class Course(models.Model):
"""课程表"""
id = models.AutoField(primary_key=True)
cname = models.CharField(max_length=32, verbose_name="课程名称")
teacher = models.ForeignKey(to="Teacher", verbose_name="老师", on_delete=models.CASCADE)

def __str__(self):
return self.cname


class Score(models.Model):
"""成绩表"""
id = models.AutoField(primary_key=True)
number = models.IntegerField()
student = models.ForeignKey(to="Student", verbose_name="学生")
course = models.ForeignKey(to="Course", verbose_name="课程")

def __str__(self):
return self.number

xx.py
from app01 import models
from django.db.models import Avg, Sum, Max, Min, Count, F, Q, Value
from django.db.models.functions import Concat

# 查询体育课的成绩
# val = models.Course.objects.values("score__number").filter(score__id=2)
# # print(val)
# 查询学生成绩高于80的人数
# val = models.Course.objects.values("score__student").filter(score__number__gt=80)
# print(val)
# 查询生物课程的学生成绩
# val = models.Student.objects.filter(score__course__cname="生物").values("score__number")
# val = models.Course.objects.filter(id=1).values("score__number")
# 查询物理课程的学生成绩
# val = models.Course.objects.filter(id=3).values("teacher__students").values("score__number")
# 查询生物/物理课学生的平均成绩
# val = models.Course.objects.filter(id=1).values("teacher__students").aggregate(Avg("score__number"))
# val = models.Course.objects.filter(id=3).values("teacher__students").aggregate(Avg("score__number"))
# 分别查询所有课程平均成绩和最大最小成绩
# val = models.Course.objects.all().aggregate(Avg("score__number"), Max("score__number"), Min("score__number"))
# 查询每个部门的平均成绩
# val = models.Course.objects.values("cname").annotate(avg=Avg("score__number")).values("cname", "avg")
# 按课程查询每个课程的最大分数和最小分数
# val = models.Course.objects.values("cname").annotate(max=Max("score__number"), min=Min("score__number")).values("cname", "max", "min")
# 查询老师下面的所有学生的平均成绩
# val = models.Teacher.objects.values("students").annotate(avg=Avg("students__score__number")).values("students", "avg")
# 查询每个班级的平均分数
# val = models.ClassTable.objects.values("caption").annotate(avg=Avg("student__score__number")).values("caption", "avg")
# 查询班级学生名字叫钢蛋或者小王八的班级
# val = models.ClassTable.objects.filter(Q(student__name="钢蛋")|Q(student__name="小王八"))
# 查询班级上名字叫小五并且老师不是波多的班级
# val = models.ClassTable.objects.filter(Q(student__name="小五") & ~Q(teacher__name="波多")).values_list("caption")
# 查询课程是生物或课程名字带物,教师名字到苍的老师("哈哈")
# val = models.Teacher.objects.filter(Q(course__cname="生物") | Q(course__cname__contains="物"), name__contains="苍")
# 把所有班级后面都加上(阳光小学)
# val = models.ClassTable.objects.all().update(caption=Concat(F("caption"), Value("("), Value("阳光小学"), Value(")")))
# 吧id=2的成绩提高22(支持+ - * /)
val = models.Score.objects.filter(id=2).update(number=F("number")+22)
print(val)






























































































以上是关于Django再次练习orm语句的主要内容,如果未能解决你的问题,请参考以下文章

Django之ORM练习

Django - ORM 练习题

Django的orm练习---多表查询

备战Django之ORM模型(增删改查)

(Django)气流中的 ORM - 有可能吗?

以py脚本形式ORM操作 及 django终端打印sql语句的设置