Si vous souhaitez trier chaque entrée de cette table par distance, ce sera lent comme prévu et il n'y a rien à faire (dont je suis conscient à ce stade et à ma connaissance.) !
Vous pouvez rendre votre calcul plus efficace en suivant ces étapes et en faisant quelques hypothèses :
-
Activer l'indexation spatiale sur vos tables. Pour cela dans GeoDjango, suivez le instructions de documentation et adaptez-les à votre modèle :
-
Vous pouvez maintenant affiner votre requête avec quelques contraintes logiques :
Ex : Mon utilisateur ne recherchera pas de personnes à plus de 50 km de sa position actuelle.
-
Affinez la recherche en utilisant
dwithin
recherche spatiale qui utilise l'indexation spatiale , donc c'est assez rapide. -
Appliquez enfin la
distance
trier par sur les lignes restantes.
La requête finale peut ressembler à ceci :
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 : Plutôt que de créer une tentative de pagination personnalisée, il est plus efficace d'utiliser les méthodes de pagination fournies pour les vues Django :
Ou vous pouvez utiliser Django Rest Framework et utiliser sa pagination :