Du kan bruge en raw ()
sql-forespørgsel for at bruge postgis order_by
operatører:
-
<->
som får den nærmeste nabo ved at bruge midten af afgrænsningsfelterne til at beregne afstanden mellem objekter. -
<#>
som får den nærmeste nabo ved at bruge selve afgrænsningsboksene til at beregne afstanden mellem objekter.
I dit tilfælde ser det ud til, at den du ønsker er
knn = Person.objects.raw(
'SELECT * FROM myapp_person
ORDER BY location <-> ST_SetSRID(ST_MakePoint(%s, %s),4326)',
[location.x, location.y]
)[:k]
REDIGERING på grund af egen derpines: Du kan udelade [:k]
for at tilføje LIMIT 1
på den rå SQL-forespørgsel. (Brug ikke begge dele, som jeg gjorde!)
I færd med at besvare dit andet spørgsmål:Hvor effektivt er det at bestille efter afstand (hele tabellen) i geodjango ,en anden løsning er måske mulig:
Ved at aktivere rumlig indeksering
og indsnævre din forespørgsel gennem logiske begrænsninger (som forklaret i mit svar
af ovenstående -linkede spørgsmål) kan du opnå en ret hurtig KNN forespørgsel som følger:
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]