PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Quelle est l'efficacité de la commande par distance (table entière) dans geodjango

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 :

  1. Activer l'indexation spatiale sur vos tables. Pour cela dans GeoDjango, suivez le instructions de documentation et adaptez-les à votre modèle :

  2. 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.

  3. Affinez la recherche en utilisant dwithin recherche spatiale qui utilise l'indexation spatiale , donc c'est assez rapide.

  4. 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 :