簡體   English   中英

遍歷Django數據庫記錄並存儲在python字典中的最快方法

[英]Quickest way to iterate through django database records and store in python dictionary

我正在使用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})

我對其他模型也做同樣的事情。 “儀表”具有大量的記錄,我正在迭代這些記錄以存儲在字典中。 我可以使這個過程更快嗎?

由於(如您在評論中所述) 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
meter = ostk_vm_tenant_quota_stats.objects.filter(cluster=site,
            collected_at=time.strftime("%Y-%m-%d")).values()

將為您提供ValueQuerySet,這基本上是Python的字典列表。 每個字典將是與您的查詢匹配的每個項目的所有字段; 基本上和上面的一樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM