Django数据库查询技巧
4.对model的外键的查询
外键的查询,其实相当于 model设置的外键名称( F_modelname )就是指向外键链接的另一个mode,所以使用方式为:
外键名F_modelname__外键Model字段__筛选条件 = ”xxxxx“
Django的视图函数view
Django前端页面渲染
Django提高渲染速度
有一个项目,一次filter出的Queryset有4000多条数据,每条数据7、8个字段
这么多数据用{%for%}迭代渲染到前端花费了20s多,太慢了
搜索了半天渲染速度提高的办法,都不知所云
然后想到会不会是Queryset数据结构的问题,迭代访问起来太慢
然后搜索一下,真是有这个问题,然后解决办法就是使用values_list(),将字典(键值对)结构转化为元组(纯值)
最终4000条数据渲染完毕耗时一点几秒,1000条数据以内不到1秒
使用方式如下:
data = StudentCgg.objects.filter((Q(id__icontains=q) | Q(name__icontains=q)) & Q(age__icontains=q)).values_list()
data = StudentCgg.objects.all().values_list()
则渲染使用如下:
{% for val in data %}
–{{ val.id }} /=修改为=> / {{ val.0 }}
–{{ val.name }} /=修改为=>/ {{ val.1 }}
–{{ val.age }} /=修改为=>/ {{ val.2 }}
{% endfor %}
下标顺序是按values_list()里的顺序
这是提供了我思路的网址
结合 .values_list() 优化查询速度
一、优化查询速度
1.Queryset类型转列表——列表生成器
适合values_list()限定提取出单个字段时使用
queryset_obj = Modelsname.objects.filters(…).order_by(…).distint().values_list(“username”,“userage”)
list_obj = [ele[0] for ele in queryset_obj] # 从queryset列表中提取每个元组的0号下标元素,构成列表
第一行末尾的values_list()可以把结果转换为Queryset列表包元组的格式:
Queryset[(xxx,“xxx”),(xxx,“xxx”),(xxx,“xxx”),…]
第二行列表生成器,提取每个元组内的0号位元素组成列表
当然,如果只是要一个字段,可以添加flat直接获取列表Queryset:
queryset_list = Modelsname.objects.filters(…).order_by(…).distint().values_list(“username”, flat=True)
生成的Queryset格式为:
Queryset[“username1”,“username2”,“username3”,…] ,可以直接当作列表使用
优: 简化queryset结构,提升使用效率
缺: 数据量大时,耗时还是比较长(惰性查询)
2.Queryset类型转字典——dict()
适合values_list()限定两个字段时 使用
queryset_obj = Modelsname.objects.filters(…).order_by().distint().values_list(“username”,“email”)
dict_obj = dict(queryset_obj) # 默认第一个字段username为键,第二个字段email为对应的值
3.目前找到一个其他的优化 筛选量大惰性查询明显 的方式:
项目的要求是从大量数据(差不多9000w条)里筛出有数据的最新的那3天日期,老的实现方法是依据时间倒序筛选前几条,耗时4s:
Models.filter(sno__icontains=“000001”).order_by(“-data_time”)[:300].xx
发现一个比这样排时间筛选耗时更低的方法:根据唯一的id从大到小排序,耗时1s:
Models.filter(sno__icontains=“000001”).order_by(“-id”)[:300].xx
二、了解惰性查询
Django查询数据库数据为惰性查询
执行一句非常复杂而庞大的python查询语句并不会花费时间,
但是第一次访问查询结果的内容时,会花费时间去数据库真正的查询数据,并将真正的结果放到缓存中
然后后续的访问查询结果将访问缓存获取.
怎么解决惰性查询问题?
我也在找,知道的大佬烦请指教!!
BootStraptable使用技巧
基本使用
BootStraptable参数大全
参数基本使用