多表查询
在日常开发中,常常要对多个数据表同时进行数据查询。多个数据表查询需要数据表之间建立表概念西才得以实现。一对多或者多对多关系是通过外键实现关联。以模型Product和Type为例:
1.如果查询对象的主体是模型Type,要查询模型Type的数据,那么该查询码称为正向查询。
2.如果查询对象的主题数模型Type,要通过模型Type查询模型Product的数据,那么该查询为反向查询。
# 正向查询
>>> t = Type.objects.filter(product__id=9)
# 反向查询
>>> t[0].product_set.values('name')
从上面的代码分析,因为正向查询的查询对象主体和查询的数据都来自于模型Type,因此正向查询在数据中执行了一次SQL查询,而反向查询执行了两次。为了减少反向查询的次数,可以使用select_related方法实现:
# 查询模型Product的字段那么和模型Type的字段type_name
>>> Product.objects.select_related('type').values('name', 'type__type_name')
>>> print(p.query)
# 查询两个模型的所有数据
>>> Product.objects.select_related('type').all()
>>> print(p.query)
# 获取两个模型的数据,以模型Product的ID大于8位查询条件
>>> Product.objects.select_related('type').filter(id__gt=8)
>>> print(p.query)
# 获取量模型数据,以模型Type的type_name字段等于手机为查询条件
>>> Product.objects.select_related('type').filter(type__type_name='手机').all()
>>> print(p.query)
select_related的使用说明如下:
1.以模型Product作为查询对象主体,当然也可以使用模型Type,只要表之间存在外键关联即可
2.设置select_related的参数值为"type",该参数值是模型Product定义的type字段。
3.如果在查询过程中需要使用另一个数据表的字段,可以使用"外键__字段名"来指向该表的字段。
除此之外,select_related还支持按个或者以上的数据表同事查询,代码如下:
>>> Product.objects.select_related('living__province').get(name='amy')
>>> p.living.provinc
上述列子通过设置select_related的参数值即可实现三个火三个以上的多表查询。参数说明如下:
1.living 是模型Person的字段,该字段指向模型City。
2.province是模型City的字段,该字段执行模型Province。
3. 两个字段之间使用双下划线连接并且连个字段都是指向另一个模型的,这说明在查询过程中,模型Person的字段living指向模型City,再从模型 City的字段province指向模型Province,从而实现三个或三个以上的多表查询。
除了上面所讲述的列子之外,Django的ORM框架还提供很多 API方法,可以满足开发中各种复杂的需求,由于篇幅有限,有兴趣的同学可以在官网查阅相关资料。