一 、ORM 查询性能
① 普通查询
#for循环10次发送10次数据库查询请求
obj_list=models.Articles.objects.all()
for row in obj_list:
print(row.name)
这种查询方式第一次发送 查询请求每for循环一次也会发送查询请求
② select_related()
结果为对象 注意query_set类型的对象 都有该方法。
查询时主动完成连表形成一张大表,for循环时不用额外发请求;
试用场景: 节省硬盘空间,数据量少时候适用相当于做了一次数据库查询;
obj_list=models.Articles.objects.all().select_related('category')
for row in obj_list:
print(row.category.name)
③ prefetch_related()
做连表操作依然会影响查询性能,所以出现prefetch_related;
prefetch_related:不做连表,多次单表查询外键表 ,去重之后显示, 2次单表查询(有几个外键做几次1+N次单表查询)
适用场景:效率高,数据量大的时候适用。
obj_list=models.Articles.objects.all().prefetch_related('category')
for obj in obj_list:
print(obj.category.name)
二、ORM 分组和聚合查询
① aggregate(*args,**kwargs) 聚合函数
通过对 QuerySet 进行计算,返回一个聚合值的字典。aggregate() 中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。
from django.db.models import Avg,Sum,Max,Min
#求书籍的平均价
ret=models.Book.objects.all().aggregate(Avg('price'))
#{'price__avg': 145.23076923076923}
② annotate(*args,**kwargs) 分组函数
#查看每一位作者出过的书中最贵的一本(按作者名分组 values() 然后annotate 分别取每人出过的书价格最高的)
ret=models.Book.objects.values('author__name').annotate(Max('price'))