【发布时间】:2020-10-11 19:32:28
【问题描述】:
我有一个 Event 模型,为了简单起见,它只有一个 lat 和 lon FloatField()。
从python原生的“geopy.distance”库中,你可以像这样获取两个坐标之间的距离:
from geopy.distance import distance
home = (33.28473, -117.20384)
event = (33.829384, -117.38932)
distance = distance(home, event).miles #returns a float
在我的应用程序上下文中,我需要按位置对所有事件进行排序。我尝试了标准的 django 注释语法:
Event.objects.all().annotate(distance=distance( (F('lat'),F('lon')), home ).miles).order_by('distance')
但我从 geopy 库中收到以下错误:
TypeError: float() argument must be a string or a number, not 'F'
奇怪的是,这行得通:
>>> def foo(x):
return x * 2
>>> Event.objects.all().annotate(cutomField=foo(F('field')))
似乎你可以用 F 类型做算术,但 geopy 似乎不知道这一点。
是否有将 F 类型转换为浮点数以便 geopy 可以处理该字段?
【问题讨论】:
-
您使用的是哪个数据库? Django 对 PostgreSQL + PostGIS + GeoDjango 提供了不错的支持
-
@IainShelvington MySQL
-
如果可以的话,我强烈建议您迁移到 PostgreSQL。 QuerySet 注释和排序发生在数据库级别,您需要一个支持地理空间功能/查询的数据库
-
@IainShelvington 我同意,但这不是地理空间功能。将自定义函数引入 SQL 并注释/创建浮点字段的原理。这可能吗?
-
它是一个地理空间函数,它返回地球上两点之间的距离。您需要定义一个调用
st_distance_sphere的自定义数据库函数
标签: django django-models django-rest-framework