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对象自身的字段,若要对关联表的字段进行统计,那聚合函数中的字段名就得是双下划线跨表查询的语句了

 

posted @ 2017-12-11 16:36  九二零  阅读(112)  评论(0编辑  收藏  举报