Als je elk item op die tafel op afstand wilt sorteren, zal het traag zijn zoals verwacht en kan er niets worden gedaan (waar ik op dit moment van op de hoogte ben en mijn kennis.)!
U kunt uw berekening efficiënter maken door deze stappen te volgen en enkele aannames te doen:
-
Schakel ruimtelijke indexering in op uw tafels. Om dat in GeoDjango te doen, volgt u de doc-instructies en pas ze aan uw model aan:
-
Nu kunt u uw zoekopdracht verfijnen met enkele logische beperkingen:
Bijvoorbeeld: Mijn gebruiker zoekt niet naar mensen die zich verder dan 50 km van zijn huidige positie bevinden.
-
Verfijn de zoekopdracht met
dwithin
ruimtelijke opzoeking die gebruikmaakt van de bovengenoemde ruimtelijke indexering , daarom is het behoorlijk snel. -
Pas ten slotte de
distance
toe bestel door op de resterende rijen.
De uiteindelijke zoekopdracht kan er als volgt uitzien:
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: In plaats van een aangepaste pagineringspoging te maken, is het efficiënter om de pagineringsmethoden voor de django-weergaven te gebruiken:
Of u kunt Django Rest Framework gebruiken en de paginering gebruiken: