Q查询: 如果你需要执行更复杂的查询(例如OR语句),你可以使用Q对象。
逻辑判断 与 或 非
Student.objects.filter(Q(s_name='秋香')|Q(s_name='夏天'))
Student.objects.filter(Q(s_name='秋香')&~Q(department__d_name="北京大学"))
F查询: 针对两个字段的值的比较
拿到每一个字段里的值
针对两个字段的值的比较
拿到某一个字段里所有查询
#详情表 年龄所有加一
Detail.objects.all().update(age=F('age')+1)
# 小于18岁的学生加一
Detail.objects.filter(age__lt=18).update(age=F('age') + 1)
聚合查询:aggregate()
aggregate()是QuerySet 的一个终止子句,它返回一个包含一些键值对的字典
Detail.objects.all().aggregate(Avg('age')) #聚合方法 平均年龄
Detail.objects.all().aggregate(Sum('age')) #聚合方法 平均年龄
#改变键值对名称
Detail.objects.all().aggregate(age=Avg('age'))
分组查询: annotate()
annotate()为调用的QuerySet中每一个对象都生成一个独立的统计值
#统计学生 报名的学校 #聚合
Student.objects.values('department') #每一个学生对应学院的值
Student.objects.values('department').annotate(count=Count('department')) #外键出现的次数
#给每个外键值重新取名称
Student.objects.values('department').annotate(count=Count('department')).values('department_id','count')
#查询每一个课程报名的人数
Course.objects.all()
Course.objects.all().annotate(count=Count('student'))
Course.objects.all().annotate(count=Count('student')).values('c_name', 'count')
#统计学生报名课程数目
Student.objects.all().annotate(count=Count('course')).values("s_name",'count')
#统计学生详细的报名课程
Student.objects.all().annotate(count=Count('course')).values("s_name", 'course')