2012-05-21 35 views
3

我需要做的旋轉在Django模板(行列轉置),我敢肯定ORM不能處理它。是否有任何內置的模板標籤,如regroup,可以照顧到樞紐。旋轉(行/列置)在Django模板

以下正是我需要的嗎?

select * from exams; 

+------+------+------+-------+ 
| pkey | name | exam | score | 
+------+------+------+-------+ 
| 1 | Bob | 1 | 75 | 
| 2 | Bob | 2 | 77 | 
| 3 | Bob | 3 | 78 | 
| 4 | Bob | 4 | 80 | 
| 5 | Sue | 1 | 90 | 
| 6 | Sue | 2 | 97 | 
| 7 | Sue | 3 | 98 | 
| 8 | Sue | 4 | 99 | 
+------+------+------+-------+ 

被列爲下面

+------+-------+-------+-------+-------+ 
| name | exam1 | exam2 | exam3 | exam4 | 
+------+-------+-------+-------+-------+ 
| Bob | 75 | 77 | 78 | 80 | 
| Sue | 90 | 97 | 98 | 99 | 
+------+-------+-------+-------+-------+ 
+0

Django不允許透視,最後一個你應該做的地方是在模板(表現層)中,但是在視圖中肯定是更好的!原始mysql查詢組成該表,它應該這樣做 –

+0

'重組'具有類似的功能,但它確實在模板中使用! – Don

回答

2

這個怎麼樣?

在你views.py ...

exams = Exam.objects.all() 
transposed = {} 

for exam in exams: 
    transposed.setdefault(exam['name'], {}).update(
         {'exam%s' % exam['exam']: exam['score']}) 

在模板...

<table> 
    <tr><th>name</th> ... </tr> 
    {% for name, scores in transposed.items %} 
    <tr><td>name</td><td>scores.exam1</td><td>scores.exam2</td> 
     <td>scores.exam3</td><td>scores.exam4</td></tr> 
    {% endfor %} 
</table> 
+1

明天我會試試 – sumit

+0

另外,選擇比「換位」更好的變量。這只是爲了幫助你看到我在做什麼。也許「student_scores」。 – jcfollower

0

你有沒有考慮使用類似pandas?它提供了一個DataFrame對象,它可以爲你提供python中的透視功能。您可以根據您的需求在視圖或模型中使用它。 舉個簡單的例子,試試看this question