12月11日学习内容整理:ORM中的基于双下划线的跨表查询,反向查询,聚合和分组
基于对象的跨表查询转换为sql语句是sql中的子查询
基于双下划线的跨表查询转换为sql语句是sql中的join
一、基于对象的反向查询
正向:关联字段在哪张表中,通过这张表查询就是正向的,一对多的关系来说,关联字段肯定在多的那张表中,所以一查多就是反向,多查一就是正向
1、一对多
model对象.另一张表名_set.all() 就拿到了当前model对象在另一张表中对应的model对象的集合
返回queryset类型
2、多对多
model对象.另一张表名_set.all() 就拿到了当前model对象在另一张表中对应的model对象的集合
返回queryset类型
3、一对一
model对象.另一张表名(全部小写) 就拿到了在另一张表中对应的model对象
返回model对象
正向的一对一就是model对象.关联字段就拿到了在另一张表中对应的model对象
二、基于双下划线的跨表查询
1、一对多
正向:queryset类型.values(关联字段_ _字段名) 循环queryset类型中的每一个model对象,关联字段_ _字段名就拿到了循环的每一个model对象对应另一张表中的model对象的字段值
反向:表名_ _字段名
_ _这样的查询方法不仅可以用到values,也可以用到filter等查询API中,但一定要注意是queryset类型去调用
多对多和一对一跟一对多都是一样的,正向按关联字段用,反向按表名用
三、聚合
先引入聚合函数:from django.db.models import Avg,Max,Min,Sum,Count
queryset类型.aggregate(变量名=聚合函数名(字段名))
返回一个字典,字典的key就是这个变量名,没写变量名的话就自动生成,value值就是聚合函数计算出来的值
若使用多个聚合函数,就在括号里面继续添加就可以了,用逗号隔开
四、分组(就是sql语句中的group by)
queryset类型集合.annotate(变量名=聚合函数名(字段名))
返回queryset类型
queryset集合调用,集合中的每一个model对象就是一个分组,不会重复,annotate再进行分组统计,统计用聚合函数实现,统计依据的字段名可以是model对象自身的字段,若要对关联表的字段进行统计,那聚合函数中的字段名就得是双下划线跨表查询的语句了