Django学习笔记之model篇(四)-- 补充

聚合查询:

首先,导入:

from .models import User
from django.db.models import Count,Avg,Max,Min,Sum,F,Q

aggregate()是QuerySet 的一个终止子句,它返回一个包含一些键值对的字典

rs = User.objects.all().aggregate(Avg('age')) # 求平均年龄
rs = User.objects.all().aggregate(Avg(average_age='age')) # 求平均年龄,给其字段取一个名字
rs=User.objects.all().aggregate(Avg('age'),Max('age'),Min('age'),Sum('age')) #

分组查询:

为调用的QuerySet中每一个对象都生成一个独立的统计值

# 第一个value是分组条件,values会转换成一个字典,最后一个value是打印输出的值,annotate是分组处理
# 学院的学生数量
rs = Student.objects.all().values('department').annotate(count=Count('department')).values('department_id','count')
# 每个学生报名课程的数量
rs = Student.objects.all().values('course').annotate(count=Count('course')).values('s_id','count')
# 课程的学生数量
rs=Course.objects.all().values('student').annotate(count=Count('student')).values('c_name','count')

F查询:

同一张表针对两个字段的值的比较

# Student表中,学院id小于学生学号的
rs = Student.objects.filter(department__d_id__gt=F('s_id'))
# 让所有人年龄加一岁
User.objects.all().update(age=F('age')+1)

Q查询:

如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。
Q对象可以使用&(and)、|(or)操作符组合起来
使用~(not)操作符在Q对象前表示取反

rs = User.objects.filter(name='xps',age=18)
rs = User.objects.filter(Q(name='xps')|Q(age=18)) # 或
# 查询name为xps,且id不为3的
rs = User.objects.filter(Q(name='xps')&~Q(id=3))