我使用Django ORM查询两个模型,每个模型返回大量数据(1500个记录/模型),然后我遍历记录并将其存储在python字典中。这需要很长时间才能执行视图,因此用户只是等待页面加载,而所有这些处理都在视图中进行。有什么方法可以让我快速完成这个过程吗?
meter = ostk_vm_tenant_quota_stats.objects.filter(cluster=site, collected_at=time.strftime("%Y-%m-%d"))
records = []
for record in meter:
record_dict = {}
record_dict['cluster'] = record.cluster
record_dict['tenant'] = record.tenant
record_dict['instances_limit'] = record.instances_limit
record_dict['instances_used'] = record.instances_used
record_dict['vcpu_limit'] = record.vcpu_limit
record_dict['vcpu_used'] = record.vcpu_used
record_dict['memory_limit'] = record.memory_limit
record_dict['memory_used'] = record.memory_used
record_dict['disk_limit'] = record.disk_limit
record_dict['disk_used'] = record.disk_used
records.append(record_dict)
return render_to_response('tabs1.html', {'data': records})
我为其他模特做同样的事情。 "米"有大量的记录,我正在迭代存储在字典中。我可以更快地完成这个过程吗?
答案 0 :(得分:2)
因为(正如您在评论中提到的)record.cluster
是一个外键,每次访问它时,django都会执行另一个数据库查找。这意味着您将在循环的每次迭代中访问数据库。查看select_related上的文档以获取更多信息。
您可以使用select_related预取相关群集,也可以使用record.cluster_id
(如果您只需要主键值)。
# using select related
meter = ostk_vm_tenant_quota_stats.objects \
.select_related('cluster') \
.filter(cluster=site, collected_at=time.strftime("%Y-%m-%d"))
# or only use the pk value in the result dict
record_dict['cluster'] = record.cluster_id
答案 1 :(得分:1)
meter = ostk_vm_tenant_quota_stats.objects.filter(cluster=site,
collected_at=time.strftime("%Y-%m-%d")).values()
将为您提供一个ValueQuerySet,它基本上是一个Python字典列表。每个字典都将是与您的查询匹配的每个项目的所有字段;基本上和你上面的一模一样。