GeoDjango中相关模型的距离

3
我正在尝试返回一个查询集,其中包含与相关模型的距离。
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 对象上计算的距离为:"
Store.objects.filter(label__hashtags__in=tags)
             .distance(location).order_by('distance')

我想要做的是在“Label”表上执行一个查询,以返回所有内容,但我怀疑这是不可能的。
在查询集上尝试“distance”方法会导致:
TypeError: ST_Distance output only available on GeometryFields.

如果做不到这一点,最明智的下一步是做最有效的事情。我能想到的唯一解决方案是执行这两个查询并将结果合并为一个集合。

在发布后的一年里偶然发现了这个问题!你正在进行距离(位置)计算,但是你的字段似乎是geopoint。所以你的查询应该是distance('geopoint')吗? - e4c5
嘿,@RobinElvin,我在想,你是否觉得我的(相当晚的)回答有帮助? - John Moutafis
@JohnMoutafis 对不起,这个项目已经过去了,所以我无法将其与原问题进行测试。如果其他人评论说它有效,我会接受您的答案。 - Robin Elvin
1个回答

1

您肯定可以实现您的查询:

  • 使用 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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接