django中QuerySet特性,如何减少数据库的访问,节省内存,提升网站性能

1. QuerySet是惰性的

articles = Article.objects.filter(content__contains="python")

但是当我们定义articles的时候,Django的数据接口QuerySet并没有对数据库进行查询。只有当你需要对articlest做进一步运算时,Django才会真正执行对数据库的查询。

for article in articles:
    print(article.content)

2. QuerySet自带缓存

当你遍历queryset时,所有匹配的记录会从数据库获取。这些结果会载入内存并保存在queryset内置的cache中。这样如果你再次遍历或读取该queryset时,Django就不需要重复查询了,这样也可以减少对数据库的查询。

如果我们只希望知道查询结果是否存在,而不需要使用查询结果。这时可以用exists()方法。与if判断不同,exists只会检查查询结果是否存在,返回True或False,而不会缓存articles。


if articles.exists():
    print("存在!")
else:
    print("不存在")

注意: 判断查询结果是否存在到底用if还是exists取决于你是否希望缓存查询数据集复用,如果是用if,反之用exists。

3. 统计查询结果数量count方法较快

len()与count()均能统计查询结果的数量。一般来说count更快,因为它是从数据库层面直接获取查询结果的数量,而不是返回整个数据集,而len会导致queryset的执行,需要将整个queryset载入内存后才能统计其长度。

但是:如果数据集queryset已经在缓存里了,使用len更快,因为它不需要跟数据库再次打交道。

num = Article.objects.filter(content__contains="python").count()

4. 当queryset非常大时,我们可以只提取部分值

articles = Article.objects.filter(content__contains="python").values('content')
if articles:
    print(article.content)
 
 
articles = Article.objects.filter(content__contains="python").values_list('id', 'content')
if articles:
    print(article.content)

 注意: 早起版本values和values_list返回的是字典形式字符串数据,而不是对象集合,

新版本:values可以输入多个参数,返回的也是queryset查询集,而values_list不支持了

5. 更新数据库部分字段update方法高效

save()方法需要把整个Article对象的数据先提取出来,缓存到内存中,变更信息后再写入数据库。update()方法直接对标题做了更新,不需要把整个文章对象的数据载入内存,显然更高效

article = Article.objects.get(id=1)
Article.title = "python"
article.save()

Article.objects.filter(id=1).update(title='python')

 6. explain方法的使用

可以统计一个查询所消耗的执行时间。这可以帮助我们更好地优化查询结果。

print(Article.objects.filter(title='python').explain(verbose=True))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专职

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值