2010-03-31 5 views
1

Django ne supporte actuellement pas le type de données "Point" dans MySQL. C'est pourquoi j'ai créé le mien.Comment faire ce modèle de base de données dans Django?

class PointField(models.Field): 
    def db_type(self): 
     return 'Point' 

class Tag(models.Model): 
    user = models.ForeignKey(User) 
    utm = PointField() 

Comme vous pouvez le voir, cela fonctionne, et syncdb crée l'amende modèle.

Cependant, mon code actuel calcule une longueur entre deux points en utilisant du SQL brut.

cursor.execute("SELECT user_id FROM life_tag WHERE\ 
       (GLength(LineStringFromWKB(LineString(asbinary(utm), asbinary(PointFromWKB(point(%s, %s)))))) < 55)... 

Ce dit: Sélectionnez où la longueur entre le point donné et le point de table est inférieure à 55

Comment puis-je faire avec Django au lieu de RAW SQL? Je ne veux plus faire de curseurs et d'instructions SELECT. Comment puis-je modifier le fichier models.py pour ce faire?

Répondre

0

Votre question est un peu floue - demandez-vous simplement comment calculer la distance entre 2 points? Ou espérez-vous que l'ORM vous donnera quelques fonctionnalités pour le faire?

Si ce dernier, alors cela ne va pas se passer sans une aide extérieure; la géométrie et la géographie sont au-delà des attributions de la plupart des systèmes de cartographie de base de données. Vous pouvez toujours utiliser les mappages automatiques pour récupérer les propriétés qui vous intéressent et les comparer manuellement en utilisant Pythagoras ou autre; pas de SQL là-bas.

En ce qui concerne l '«assistance externe» dont j'ai parlé, vous pouvez consulter le GeoDjango qui pourrait vous être utile. (Il y a aussi GeoAlchemy pour les personnes ayant des problèmes similaires mais n'utilisant pas Django pour l'ORM.)

Questions connexes