Puoi utilizzare un raw()
query sql per utilizzare Postgis order_by
operatori:
-
<->
che ottiene il vicino più vicino utilizzando i centri dei riquadri di delimitazione per calcolare le distanze tra gli oggetti. -
<#>
che ottiene il vicino più vicino utilizzando i riquadri di delimitazione stessi per calcolare le distanze tra gli oggetti.
Nel tuo caso quello che vuoi sembra essere il <->
operatore, quindi la query grezza:
knn = Person.objects.raw(
'SELECT * FROM myapp_person
ORDER BY location <-> ST_SetSRID(ST_MakePoint(%s, %s),4326)',
[location.x, location.y]
)[:k]
EDIT a causa della propria depiness: Puoi omettere il [:k]
per aggiungere LIMIT 1
sulla query SQL grezza. (Non usare entrambi come ho fatto io!)
Nel processo di risposta alla tua altra domanda:Quanto è efficiente ordinare per distanza (intera tabella) in geodjango ,un'altra soluzione forse possibile:
Abilitando l'spatial indexing
e restringendo la tua query attraverso vincoli logici (come spiegato nella mia risposta
della domanda collegata sopra) puoi ottenere un KNN abbastanza veloce interrogare come segue:
current_location = me.location
people = People.objects.filter(
location__dwithin=(current_location, D(km=50))
).annotate(
distance=Distance('location', current_location)
).order_by('distance')[:k]