2015-05-06 421 views
3

我試圖從距離相關模型的距離返回一個查詢集。相關模型的GeoDjango距離

models.py(簡體)

class Store(models.Model): 
    geopoint = models.PointField(srid=4326) 

    objects = models.GeoManager() 


class HashTag(models.Model): 
    tag = models.CharField(max_length=100) 


class Label(models.Model): 
    hashtags = models.ManyToManyField(HashTag) 
    store = models.ForeignKey(Store) 

我需要返回是具有從給定的點按距離排序一定的標記/標籤的標籤對象。

Label.objects.filter(hashtags__in=tags) 

距離可在存儲對象與計算:

Store.objects.filter(label__hashtags__in=tags) 
      .distance(location).order_by('distance') 

我想要做的就是在Label表來執行查詢

標籤可以通過找到返回一切,但我懷疑這是不可能的。

試圖在查詢集結果distance方法:

TypeError: ST_Distance output only available on GeometryFields. 

失敗,這將是有意義的做最有效的退而求其次。我能想出的唯一解決方案是執行兩個查詢並將結果合併到一個集合中。

+0

這完全是一個年偶然發現它被張貼後!您正在做距離(位置),但您的字段似乎是地理位置。所以你的查詢不應該是距離('geopoint')? – e4c5

+0

嗨,@RobinElvin我發佈了一個晚(只有2年)的答案。看一看! –

回答

0

這是絕對有可能實現您的查詢:

  • 使用annotate()Label對象上追加的距離值。
  • 使用Distance()函數來計算每家商店的geopointlocation

查詢應該是這樣的距離:

from django.contrib.gis.db.models.functions import Distance 

Label.objects.filter(hashtags__in=tags) 
      .annotate(distance=Distance('store__geopoint', location)) 
      .order_by('distance')