2015-10-13 48 views
0

好吧,我有問題從數據生成CSV文件。Django csv下載性能問題

我有一個約6000個對象的列表。這些對象就像自定義表格一樣,因此每個對象都有許多與其關聯的字段。例如一個請求可以由姓名,年齡,電話號碼等組成。在這種情況下,每個請求都有相同的字段。所以每種形式都與這些領域有一對多的關係。

因此,我將這個自定義窗體和一些標準的東西從它作爲一個ValuesQuerySet獲取,然後獲取與此窗體關聯的所有字段。並將它們添加到每一行。最後,我使用字典編寫器將數據寫入csv。這一切都很好,但性能很糟糕。要做6,000個記錄,每個記錄大約有15個自定義字段需要大約90秒(這會觸發超時錯誤)。我需要某種方法來加快速度。

我的代碼看起來是這樣的....

forms = SomeForm.objects.filter(created_by=user).values('value1', 'value2', 'etc...') 
for form in forms: 
    id = form['id'] 
    fields = Fields.objects.filter(Form_id=id).values('value', 'field__label') 
    for field in fields: 
     label = field['form_field__label'] 
     value = field['value'] 
     form[label] = value 
writer = csv.DictWriter(response, fieldnames=fieldnames) 
writer.writeheader() 
writer.writerows(forms) 

某些代碼被刪除,但這是它的要點。 如果你可以想辦法加快速度,或者採取其他方法來處理它,我會非常感激。

+1

你有沒有嘗試過讓'created_by'字段成爲索引?這可能會增加性能...... – BorrajaX

+0

雅,這是我想到的事情之一。經過一番研究,在django中,當你用外鍵定義一個模型時,它會自動設置db_index = True。 (還是)感謝你的建議。 – mingle

+1

爲防萬一您沒有注意到,django在查詢集上具有'select_related'和'prefetch_related'函數,可以在一個查詢中加載一些關係並將它們放入查詢集緩存中。也許這會有所幫助。 –

回答

0

雅我最終採取了cdvv7788的建議,並將其作爲芹菜任務。謝謝你們