django模型基础五:模型补充内容 F查询 Q查询

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


猜你喜欢

转载自blog.csdn.net/qq_42662411/article/details/104693953
今日推荐