我想计算GeoDjango中同一模型上两个字段之间的距离。这是我尝试这样做的方式:
posts = Post.objects.filter(location__distance_lte=(ref_location,D(km=F('i_move'))
其中location是PointField,i_move是float。然而,这不起作用,django投掷:
float()参数必须是字符串或数字,而不是' F'
我还试图先获得一个大数字的距离,而不是注释,之后比较距离现场的距离:
Post.objects.filter(location__distance_lte=(ref_location, D(km=100))
).annotate(distance=Distance('location', ref_location)
).filter(distance=F('i_move'))
这根本不起作用,不会抛出任何错误。
虽然我觉得这个问题不是最新的,但我找不到任何人做类似的事情。
答案 0 :(得分:0)
似乎不可能使用F字段查找以传统的方式进行。我最终使用了额外的查询参数和postgres的Type definitions函数,这实际上非常好,因为它返回以米为单位的距离:
posts = Post.objects.filter(....).extra(
where=['ST_Distance_Sphere(location::geometry, ST_GeomFromText(%s)) <= i_move*1000'],
params=[ref_location.wkt])
ref_location是一个django Point(),location是一个PointField,而i_move是一个float。 Django Points有一个wkt方法来获取他们的wkt表示。但是,当ST_Distance_Sphere接受几何对象时,应使用postgres cast&#34; ::&#34;和ref_location使用St_Distance_Sphere函数转换位置。