django之ORM跨表操作

多表查询数据:
基于对象跨表查询(子查询)

基于双下线方法查询(join查询)

查询:反向涉及到多个对象的时候,加_set
-- 一对多:
正向查询按字段
反向的多对多查询的时候,查询字段的拼接是表名(小写)_set.all() --> (集合的形式)查到所有

-- 多对多:
正向查询按字段 对象.字段.all()
反向的多对多查询的时候,查询字段的拼接是表名(小写)_set.all() --> (集合的形式)查到所有

-- 一对一:
正向查询按字段
反向查询按表名(小写)


双下划线方法:正向查询按字段,反向查询按表名
-- 跨表查询(join方法的查询),基于Queryset对象的查询
A表中的字段xxx关联B表中对应的对象,aa是B表对象的字段
正向查询:
-- 先查询再跨表
A.objects.过滤条件(ss="ss").values("xxx__aa") queryset对象
-- 先跨表在查询
A.objects.过滤条件(A_xx="xx").values(ss) queryset对象

反向查询:
-- 先查询再跨表
B.objects.过滤条件(ss="ss").values("A__xxx") queryset对象
-- 先跨表在查询
B.objects.过滤条件(A__xx="xx").values(ss) queryset对象



聚合查询和分组查询,要使用双下划线查询:
导入聚合函数from django.db.models import Avg,Sum,Count,Min

聚合查询:
聚合函数:aggregate
dict = A.objects.all().aggregate(name=聚合函数("字段")) --> 返回字典
name--起别名,作为字典中的key显示
aggregate被称为queryset的终止函数,因为返回的是字典

分组查询
分组函数:annotate
取值方法1:
a_list = A.objects.all().annotate(num=聚合函数("字段")) --> 返回queryset对象
for i in a_list:
print(i.num) --> num字段保存的是分组的结果,annotate会自动给A中的符合条件的添加字段,保存分组之后的结果

取值方法2:
a_list = A.objects.all().annotate(num=聚合函数("字段")).values("name","num")
posted @ 2017-12-11 15:45  chitalu  阅读(121)  评论(0)    收藏  举报