2010-05-31 5 views
8

Speriamo che questa dovrebbe essere una domanda abbastanza semplice, semplicemente non ne so abbastanza su Python e Django per rispondere.Django: creazione di query SQL raw, passaggio di parametri multipli/ripetuti?

Ho una query SQL prima in Django che prende sei parametri diversi, i primi due dei quali (centreLat e centreLng) sono ciascuno ripetuto:

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) 

Come faccio a strutturare l'oggetto params e la query stringa in modo che sappiano quali parametri ripetere e dove?

risposta

12

Hai (almeno) due opzioni. Si potrebbe anche includere i parametri ripetuti nel proprio elenco nell'ordine in cui hanno bisogno di apparire - il che significa che si potrebbe finire con gli stessi valori nella lista più volte in questo modo:

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

Oppure, si potrebbe nominare ogni parametro utilizzando un dizionario e invece di usare solo un "% s" si potrebbe usare "% (name) s" come questo:

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} 

(non copiare il codice che testualmente, sono sicuro che non è esattamente di cosa hai bisogno)

+3

La risposta del dizionario mi sembra migliore. Mi piace sempre usare i parametri con nome. È meglio anche per la leggibilità. –

Problemi correlati