2017-06-08 1 views
-1

Le code suivant filtrera correctement:Django django.contrib.gis.db.models.functions.Distance pour revenir des valeurs en pieds au lieu de mètres

def nearby(self, latitude, longitude, proximity=None): 
     """Get nearby Merchants. 

     Custom queryset method for getting merchants associated with 
     nearby places. 

     Returns: 
      A queryset of ``Merchant`` objects. 

     """ 
     point = Point(latitude, longitude) 

     # we query for location nearby for places first and then 
     # annotate with distance to the same place 
     return self.filter(
      places__location__distance_lte=(point, D(ft=proximity)) 
     ).annotate(distance=models.Min(Distance('places__location', point))) 

mais la valeur retournée par

models.Min(Distance('places__location', point)) 

est en mètres.

Est-il possible de l'avoir en pieds?

Répondre

0

Si nous jetons un coup d'oeil au Distance documentation, nous verrons ceci:

L'attribut de distance est un objet à distance, vous pouvez facilement exprimer la valeur dans les unités de votre choix.

Bien que ce n'est pas entirely true:

Ces deux ne sont pas que étroitement liés les uns aux autres. Les docs disent en effet qu'il "renvoie" l'objet Distance, mais il y a une étape supplémentaire:

est une fonction de base de données, elle prend deux expressions (qui peuvent inclure des noms de champs de base de données) et renvoie un objet Func pouvant être utilisé dans le cadre d'une requête.

Donc, simplement, il doit être exécuté dans une base de données. Il calcule la fonction de base de données en utilisant la distance (par exemple PostGIS ST_Distance), puis le ramener comme un objet django.contrib.gis.measure.Distance


A en juger par ce qui précède que vous pouvez faire:

... .annotate(distance=models.Min(Distance('places__location', point).ft))