我们平时在取数据库中的一对多关系进行连表查询的时候一般都是以点的形式来查询
取当前表数据
ut表和user表通过foreignkey连接
user_list = models.UserInfo.object.all()
for row in user_list:
print(row.name, row.pwd, row.ut.caption)
通过这种方式来查询效率很低
select_related查询
取当前字段和Foreignkey表关联字段
我们可以通过这种方式来提高效率
user_list = models.UserInfo.object.all().select_related('ut')
user_list = models.UserInfo.object.values('name','pwd','ut_caption')
# 其中ut为foreign中的字段名
使用这种方式取数据的话不仅把userinfo取到了,而且还将和他关联的ut表的数据也取到了,这种方式直接一次性取出,因此效率较高
取当前表字段和多个foreign表关联字段
如果想继续链表查询
假设userinfo表还和ro有foreign链接
user_list = models.UserInfo.object.all().select_related('ut__ro')
可以这样查询,但是这种方法写不来manytomany字段
就工作中的实际情况来看的话,公司里面访问量都会相当大,为了速度,根本就不会使用Foreignkey来查询,因为这样会降低性能
prefetch_related
user_list = models.UserInfo.object.all().prefetch_related('ut','xx')
这种方法只执行了两次查询,但是没有连表,是一种折中的方案
only
user_list = models.UserInfo.object.all().only('name')
for row in user_list:
print(row.name)
使用这种方法只会取到某一列,因此,如果我们只用某一咧的情况下我们应该使用这种方法提高效率,但是这种方法不能连表查询
defer
user_list = models.UserInfo.object.all().defer('name')
for row in user_list:
print(row.其他)
这种方法排除当前字段,这样,后面就不能用name字段