Se você quiser classificar todas as entradas nessa tabela por distância, será lento como esperado e não há nada que possa ser feito (que eu saiba neste momento e meu conhecimento.)!
Você pode tornar seu cálculo mais eficiente seguindo estas etapas e fazendo algumas suposições:
-
Ative a indexação espacial em suas mesas. Para fazer isso no GeoDjango, siga o instruções do documento e ajustá-los ao seu modelo:
-
Agora você pode restringir sua consulta com algumas restrições lógicas:
Ex: Meu usuário não procurará pessoas a mais de 50km de sua posição atual.
-
Restrinja a pesquisa usandodwithin
pesquisa espacial que utiliza o acima mencionado indexação espacial , portanto, é bastante rápido.
-
Por fim, aplique adistance
ordenar por nas linhas restantes.
A consulta final pode ficar assim:
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: Em vez de criar uma tentativa de paginação personalizada, é mais eficiente utilizar os métodos de paginação fornecidos para as visualizações do django:
Ou você pode usar o Django Rest Framework e usar sua paginação: