Hvis du ønsker at sortere hver post på den tabel efter afstand, vil det være langsomt som forventet, og der er intet, der kan gøres (som jeg er klar over på dette tidspunkt og min viden).
Du kan gøre din beregning mere effektiv ved at følge disse trin og gøre nogle antagelser:
-
Aktiver rumlig indeksering på dine borde. For at gøre det i GeoDjango skal du følge denne doc instruktioner og tilpas dem til din model:
-
Nu kan du indsnævre din forespørgsel med nogle logiske begrænsninger:
Eks.: Min bruger vil ikke lede efter personer mere end 50 km fra hans nuværende position.
-
Indsnævre søgningen ved hjælp af
dwithin
rumligt opslag, som anvender ovennævnte rumlig indeksering , derfor er det ret hurtigt. -
Anvend endelig
distance
sorter efter på de resterende rækker.
Den endelige forespørgsel kan se sådan ud:
current_location = me.location
people = People.objects.filter(
location__dwithin=(current_location, D(km=50))
).annotate(
distance=Distance('location', current_location)
).order_by('distance')
PS: I stedet for at oprette et brugerdefineret pagineringsforsøg er det mere effektivt at bruge pagineringsmetoderne til django-visningerne:
Eller du kan bruge Django Rest Framework og bruge dets paginering: