gpt4 book ai didi

python - GeoDjango 按与模型字段的距离过滤

转载 作者:行者123 更新时间:2023-12-04 21:12:03 24 4
gpt4 key购买 nike

我的问题与 this 几乎相同.但是它很旧,感觉它一定是一个相当普遍的场景,可能有更好的解决方案。

我有一个类似的模型:

class Person(models.Model):
location = models.PointField(srid=4326)
willing_to_travel = models.IntegerField()

如果我想要在某个点的设定距离(例如 10 英里)内的所有 Person 实例 p ,我可以这样做:
Person.objects.filter(location__distance_lte=(p, D(mi=10)))

但我想获得在他们的 willing_to_travel 内的所有 Person 实例。特定位置的距离。

最佳答案

感谢 Geographic Database Functions,这是可能的在 Django 1.9 中引入

allow users to access geographic database functions to be used in annotations, aggregations, or filters in Django.



我们最感兴趣的是 Distance ,它可以应用于您的情况如下:
from django.contrib.gis.db.models.functions import Distance
from django.db.models import F
Person.objects.annotate(distance=Distance('location', p)
).filter(distance__lte=F('willing_to_travel'))

注意这里有细微的差别,而不是直接使用 distance_lte在这里,我们创建了一个注释,为我们提供了一个距离列。然后我们使用来自模型查询集的标准 __lt 比较。这(大致)翻译成
   ... WHERE ST_Distance(app_person.location, ST_GeogFromWKB(...)) < 
app_person.willing_to_travel

distance_lte 生产的类似它不像使用 ST_Dwithin 那样有效,但它可以完成工作

您需要将位置转换为地理,因为此查询对“字段单位”进行操作,这意味着度数。如果您使用地理字段,距离将以米为单位。

关于python - GeoDjango 按与模型字段的距离过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32609729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com