Se vuoi ordinare ogni voce su quel tavolo in base alla distanza, sarà lento come previsto e non c'è nulla che si possa fare (di cui sono a conoscenza a questo punto del tempo e delle mie conoscenze.)!
Puoi rendere il tuo calcolo più efficiente seguendo questi passaggi e facendo alcune ipotesi:
-
Abilita indicizzazione spaziale sulle tue tavole Per farlo in GeoDjango, segui il istruzioni sul documento e adattali al tuo modello:
-
Ora puoi restringere la tua query con alcuni vincoli logici:
Es: Il mio utente non cercherà persone a più di 50 km dalla sua posizione attuale.
-
Restringi la ricerca utilizzando
dwithin
ricerca spaziale che utilizza la summenzionata indicizzazione spaziale , quindi è abbastanza veloce. -
Infine applica la
distance
ordina per nelle righe rimanenti.
La query finale può assomigliare a questa:
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: Piuttosto che creare un tentativo di impaginazione personalizzato, è più efficiente utilizzare i metodi di impaginazione forniti per le viste django:
Oppure puoi usare Django Rest Framework e usarne l'impaginazione: