Můžete použít raw()
sql dotaz k použití postgis order_by
operátoři:
-
<->
který získá nejbližšího souseda pomocí středů ohraničujících rámečků k výpočtu vzdáleností mezi objekty. -
<#>
který získá nejbližšího souseda pomocí samotných ohraničujících rámečků k výpočtu vzdáleností mezi objekty.
Ve vašem případě se zdá, že ten, který chcete, je <->
operátor, tedy nezpracovaný dotaz:
knn = Person.objects.raw(
'SELECT * FROM myapp_person
ORDER BY location <-> ST_SetSRID(ST_MakePoint(%s, %s),4326)',
[location.x, location.y]
)[:k]
UPRAVIT z důvodu vlastní derpity: Můžete vynechat [:k]
přidat LIMIT 1
na nezpracovaný SQL dotaz. (Nepoužívejte oba jako já!)
V procesu odpovídání na vaši další otázku:Jak efektivní je objednávat podle vzdálenosti (celý stůl) v geodjango ,možná jiné řešení:
Povolením spatial indexing
a zúžení vašeho dotazu pomocí logických omezení (jak je vysvětleno v mé odpovědi
z výše propojené otázky) můžete dosáhnout docela rychlého KNN dotaz takto:
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]