Si desea ordenar cada entrada en esa tabla por distancia, entonces será lento como se esperaba y no hay nada que se pueda hacer (que yo sepa en este momento y mi conocimiento).
Puede hacer que su cálculo sea más eficiente siguiendo estos pasos y haciendo algunas suposiciones:
-
Habilite indexación espacial en vuestras mesas. Para hacerlo en GeoDjango, siga la instrucciones del documento y ajústelos a su modelo:
-
Ahora puede limitar su consulta con algunas restricciones lógicas:
Ej: Mi usuario no buscará personas a más de 50 km de su posición actual.
-
Limite la búsqueda usando
dwithin
búsqueda espacial que utiliza la indexación espacial , por lo tanto, es bastante rápido. -
Finalmente aplica la
distance
ordenar por en las filas restantes.
La consulta final puede verse así:
current_location = me.location
people = People.objects.filter(
location__dwithin=(current_location, D(km=50))
).annotate(
distance=Distance('location', current_location)
).order_by('distance')
PD: En lugar de crear un intento de paginación personalizado, es más eficiente utilizar los métodos de paginación proporcionados para las vistas de Django:
O puede usar Django Rest Framework y usar su paginación: