2010-05-31 32 views
8

希望這應該是一個相當直接的問題,我只是不太瞭解Python和Django來回答它。Django:製作原始SQL查詢,傳遞多個/重複的參數?

我有在Django原始SQL查詢,需要六個不同的參數,其中前兩個的(centreLat和centreLng)分別重複:

query = "SELECT units, (SQRT(((lat-%s)*(lat-%s)) + ((lng-%s)*(lng-%s)))) AS distance FROM places WHERE lat<%s AND lat>%s AND lon<%s AND lon>%s ORDER BY distance;" 
params = [centreLat,centreLng,swLat,neLat,swLng,neLng] 
places = Place.objects.raw(query, params) 

如何組織的params對象和query字符串,所以他們知道哪些參數重複和在哪裏?

回答

12

您有(至少)兩個選項。您既可以在您的訂單列表中的那些重複的參數,他們需要出現 - 這意味着你會多次落得同樣的值列表如下:

params = [centreLat,centreLng,swLat,neLat,swLng,neLng,centreLat,centreLng] 

或者,你可以命名每個

query = "SELECT units, (SQRT(((lat-%(lat)s)*(lat-%(lat)s)) + ((lng-%(lng)s)*(lng-%(lng)s)))) AS distance FROM places WHERE lat<%(lat)s AND lat>%(lat)s AND lon<%(lng)s AND lon>%(lng)s ORDER BY distance;" 
params = {'lat':centreLat,'lng':centreLng} 

(不要複製的代碼逐字,我敢肯定這是不完全:使用字典和,而不是使用只是一個「%s」時,你可以用「%(名稱)的」像這樣的參數你需要什麼)

+3

字典答案對我來說似乎更好。我總是喜歡使用命名參數。 readability也更好。 – 2011-04-22 07:01:58