82.常用的返回QuerySet对象的方法使用详解:all,select_related
Posted guyan-2020
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了82.常用的返回QuerySet对象的方法使用详解:all,select_related相关的知识,希望对你有一定的参考价值。
1. all: 返回这个ORM模型的QuerySet对象。
articles = Article.objects.all()
print(articles)
2.select_related: 查找数据的时候,可以一次性的将相关联的其他的表的数据都提取出来,这样可以在以后访问相关联的表的数据的时候,不用再次查找数据库,可以节省一些开销,示例代码如下:
from django.http import HttpResponse
from .models import Article, Category
def 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语句进行查询,示例代码如下:
from django.http import HttpResponse
from .models import Article, Category
def 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”来实现。
以上是关于82.常用的返回QuerySet对象的方法使用详解:all,select_related的主要内容,如果未能解决你的问题,请参考以下文章