GeoDjango相关模型的距离

时间:2015-05-06 16:20:02

标签: python django postgis 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对象,它们具有按给定点的距离排序的特定标记/标记。

标签可以通过以下方式找到:

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.

如果没有做到最有效率的下一个最好的事情是有意义的。我能想出的唯一解决方案是执行两个查询并将结果合并到一个集合中。

1 个答案:

答案 0 :(得分: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')