请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

82.常用的返回QuerySet对象的方法使用详解:all,select_related

[复制链接]
查看: 51|回复: 0

2万

主题

3万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
85196
发表于 2020-2-6 15:50 | 显示全部楼层 |阅读模式
1. all: 返回这个ORM模子的QuerySet工具。
  1. articles = Article.objects.all()print(articles)
复制代码
2.select_related: 查找数据的时候,可以一次性的将关连联的其他的表的数据都提取出来,这样可以在今后拜候关连联的表的数据的时候,不用再次查找数据库,可以节省一些开销,示例代码以下:
  1. from django.http import HttpResponsefrom .models import Article, Categorydef index(request):# 利用select_related()方式提取关连联的数据表中的数据,会姑且的寄存在内存中,# 再次检察的时候就不用再次拜候数据库表了,可以大猛进步拜候的服从articles = Article.objects.select_related('category')    for article in articles:        print(article.category.name)    print(connection.queries)    return HttpResponse("success!")
复制代码
打印出成果以下:

最新文章
最新文章
最热文章
高评分文章
[{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, {'sql': 'SELECT article.id, article.title, article.content, article.category_id, article.create_time, category.id, category.name, category.rating FROM article LEFT OUTER JOIN category ON (article.category_id = category.id)', 'time': '0.000'}]
一样也可以不放在内存中,可是这样django底层会实行更多的sql语句举行查询,示例代码以下:
  1. from django.http import HttpResponsefrom .models import Article, Categorydef index(request):    articles = Article.objects.all()    for article in articles:        print(article.category.name)    print(connection.queries)    return HttpResponse("success!")
复制代码
返回的成果以下:

最新文章
最热文章
高评分文章
最新文章
[{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, {'sql': 'SELECT article.id, article.title, article.content, article.category_id, article.create_time FROM article', 'time': '0.000'}, {'sql': 'SELECT category.id, category.name, category.rating FROM category WHERE category.id = 1 LIMIT 21', 'time': '0.000'}, {'sql': 'SELECT category.id, category.name, category.rating FROM category WHERE category.id = 2 LIMIT 21', 'time': '0.000'}, {'sql': 'SELECT category.id, category.name, category.rating FROM category WHERE category.id = 3 LIMIT 21', 'time': '0.000'}, {'sql': 'SELECT category.id, category.name, category.rating FROM category WHERE category.id = 1 LIMIT 21', 'time': '0.000'}]
由实行的sql语句可以看出,实行all()方式的sql语句会实行更多条,是以会低落查询的服从,所以可以在数据量不太大,而且查询的次数较多的时候,可以利用select_related方式将关连联的数据表中的数据提取到内存中,以便以后加速查询的服从。

留意:这个方式只能用在界说了外键的字段上,也可以说是用在外键的关联工具(表)上,对于多对多,大如果多对一的情况,不能利用select_related()方式。而应当利用“prefetch_related”来实现。

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表