2010-03-05 5 views
0

Je stocke la latitude et la longitude comme un charfield comme ("latitude, longitude"). Je préfère garder ça comme ça.Django: Filtrage sur un champ ("latitude, longitude")

Je dois filtrer les résultats pour afficher uniquement la latitude> w, la latitude < x, la longitude> y, la longitude < z.

Comment puis-je faire cela sans changer comment je stocke le lat, long?

+3

Vous maintenant que Django fournit une belle API de géolocalisation? http://geodjango.org/ –

+2

Si vous pouvez penser à une méthode SQL standard pour le faire alors vous pouvez probablement le faire avec ORM de Django, si vous ne pouvez pas alors vous ne pourrez probablement pas le faire. Comment tenteriez-vous cela en SQL standard? –

+0

Ceci est un bon article expliquant l'utilisation du géoréférencement dans django. http://www.chicagodjango.com/blog/geo-django-quickstart/ –

Répondre

5

L'ORM de Django ne pourra pas vous aider à filtrer sur ce champ. Votre schéma n'est pas conçu correctement pour le type de requête que vous tentez.

Mes suggestions:

  • Modifier votre schéma à utiliser les colonnes numériques séparés pour commencer. (Je sais que vous recherchez spécifiquement une option qui évite cela mais c'est toujours la bonne solution).

  • Ajoutez deux nouvelles colonnes numériques et mettez ces colonnes à jour/définies chaque fois qu'une modification est apportée au modèle. Vous devrez également effectuer une mise à jour de masse unique pour définir les valeurs initiales de toutes les lignes existantes.

  • Vous pouvez être en mesure de monter une requête SQL personnalisée qui passera par chaque ligne et diviser la colonne pour récupérer les valeurs numériques séparées pour la latitude et la longitude et filtrer sur elles. Dans ce cas, vous contournerez l'ORM et passerez directement à SQL par vous-même et devrez utiliser toutes les méthodes de split disponibles sur votre base de données (fonction split personnalisée, regex, etc.). La requête sera lente.

  • Ajoutez une méthode à votre modèle qui divisera la chaîne en Python et retournera les données numériques. Pour faire n'importe quel type de filtrage utilisez ces données vous aurez besoin de tirer tous les modèles de votre base de données (cher) et faire le filtrage en mémoire (rapide mais vous perdez les avantages de SQL et/ou l'ORM). Cette option ne sera probablement pas très bien adaptée.

Bonne chance ...

1

Comme l'un des commentateurs mentionnés, vous devriez vraiment regarder à Geodjango, qui offre un support d'information géo-native. De leur page: GeoDjango est un add-on pour Django qui le transforme en un framework web géographique de classe mondiale. GeoDjango s'efforce de rendre aussi simple que possible de créer des applications Web géographiques, comme les services basés sur la localisation. Certaines caractéristiques comprennent:

  • Champs de modèle Django pour les géométries OGC, qui peuvent être modifiés dans l'admin.
  • Extensions de l'ORM de Django pour l'interrogation et la manipulation de données spatiales.
  • Interfaces Python de haut niveau faiblement couplées pour les opérations de géométrie SIG et les formats de données.
Questions connexes