2013-01-10 35 views
0

我需要執行原始查詢時:Django的:模板格式的原始查詢中使用cursor.execute()

cursor.execute("select id, name from people") 
results = cursor.fetchall() 

如何轉換,這樣我可以在Django模板使用它:

{% for person in results %} 
    {{person.name}} 
{% endfor %} 

通常情況下,我會使用模型:

results = people.objects.raw("select id, name from people") 

這工作,無論我在查詢了多少其他型號/表使用。

但是,該方法要求我包含人員模型的主要id。我不能這樣做,因爲sql實際上是一個group by查詢,並且不能包含該id。

我一定要使用原始的sql,而不是其他方式做相當於「group by」。

+0

你想要執行的是什麼實際查詢?也許可以通過django ORM來完成。 –

回答

0

這工作。將元組的元組轉換爲字典列表並從cursor.description獲取字段描述。可以作爲一個小功能。而且可能有一些聰明的lamdba可以縮短它的長度。

 cursor = connection.cursor() 
     cursor.execute(my_select) 
     results = cursor.fetchall() 

     x = cursor.description 
     resultsList = [] 
     for r in results: 
      i = 0 
      d = {} 
      while i < len(x): 
       d[x[i][0]] = r[i] 
       i = i+1 
      resultsList.append(d) 

     return render_to_response(my_template, {"results":resultsList}) 
0

如果你堅持,你需要使用MySQLdb的光標來執行原始的SQL查詢,然後創建一個字典光標DictCursor,使列值可以通過名稱而不是位置進行訪問。

cursor.close() 
cursor = conn.cursor (MySQLdb.cursors.DictCursor) 
cursor.execute ("SELECT id, name FROM people") 
results = cursor.fetchall() 
for row in results: 
    print "%s, %s" % (row["id"], row["name"]) 

使用DictCursor你不需要做任何事情只是把它傳遞給模板,並使用它,你有Django的查詢集做同樣的方式。

+0

這不起作用。似乎你必須在connect()而不是cursor()中提供MySQLdb.cursors.DictCursor參數。但我使用Django自動執行連接。順便說一句,這需要導入MySQLdb – user984003

+0

這是'MySQLdb'遊標不是爲Django的數據庫遊標。 –

+0

但是我不得不做connectionm提供密碼等?我喜歡Django爲我做的。 – user984003